Collectors.toMap() keyMapper -- 更简洁的表达?

2022-08-31 11:56:32

我试图在下面的调用中为“keyMapper”函数参数提出一个更简洁的表达式:Collectors.toMap()

List<Person> roster = ...;

Map<String, Person> map = 
    roster
        .stream()
        .collect(
            Collectors.toMap(
                new Function<Person, String>() { 
                    public String apply(Person p) { return p.getLast(); } 
                },
                Function.<Person>identity()));

似乎我应该能够使用lambda表达式将其内联,但我无法提出一个编译表达式。(我对lambdas很陌生,所以这并不奇怪。

谢谢。

-->更新:

如已接受的答案中所述

Person::getLast

是我一直在寻找的东西,也是我尝试过的东西。然而,Eclipse 4.3的BETA_8夜间构建是问题所在 - 它将其标记为错误。当从命令行编译时(我应该在发布之前完成),它有效。因此,是时候向 eclipse.org 提交错误了。

谢谢。


答案 1

您可以使用 lambda:

Collectors.toMap(p -> p.getLast(), Function.identity())

或者,更简洁地说,您可以使用以下方法引用::

Collectors.toMap(Person::getLast, Function.identity())

而不是 ,您可以简单地使用等效的 lambda:Function.identity

Collectors.toMap(Person::getLast, p -> p)

如果您使用 Netbeans,则每当匿名类可以被 lambda 替换时,您都应该收到提示。


答案 2
List<Person> roster = ...;

Map<String, Person> map = 
    roster
        .stream()
        .collect(
            Collectors.toMap(p -> p.getLast(), p -> p)
        );

这将是翻译,但我还没有运行这个或使用API。最有可能的是,你可以用 p -> p 代替 Function.identity()。并静态导入到Map(...)