85

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

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 nightly build 是个问题——它标记为错误。从命令行编译时(我应该在发布之前完成),它起作用了。因此,是时候向 eclipse.org 提交错误了。

谢谢。

4

3 回答 3

199

您可以使用 lambda:

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

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

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

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

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

如果您使用 Netbeans,则只要匿名类可以被 lambda 替换,您就会得到提示。

于 2013-10-08T20:34:37.930 回答
30
List<Person> roster = ...;

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

那将是翻译,但我没有运行它或使用 API。您很可能可以将 p -> p 替换为 Function.identity()。并静态导入 toMap(...)

于 2013-10-08T19:41:04.187 回答
6

我们也可以在相同键冲突的情况下使用可选的合并功能。例如,如果两个或多个人具有相同的 getLast() 值,我们可以指定如何合并这些值。如果我们不这样做,我们可能会得到 IllegalStateException。这是实现此目的的示例...

Map<String, Person> map = 
roster
    .stream()
    .collect(
        Collectors.toMap(p -> p.getLast(),
                         p -> p,
                         (person1, person2) -> person1+";"+person2)
    );
于 2016-11-30T10:45:24.687 回答