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

时间:2013-10-08 17:57:03

标签: java collections lambda java-8 java-stream

我正试图在以下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很新,所以这并不奇怪。)

感谢。

- &GT;更新:

如接受的答案所述

Person::getLast

是我正在寻找的东西,也是我尝试过的东西。然而,Eclipse 4.3的BETA_8每晚构建是问题 - 它标记为错误。从命令行编译时(我应该在发布之前完成),它起作用了。所以,是时候用eclipse.org提交bug了。

感谢。

3 个答案:

答案 0 :(得分:171)

您可以使用lambda:

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

或者更简洁地说,您可以::使用Collectors.toMap(Person::getLast, Function.identity())

Function.identity

而不是Collectors.toMap(Person::getLast, p -> p) ,您只需使用等效的lambda:

{{1}}

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

答案 1 :(得分:25)

List<Person> roster = ...;

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

这将是翻译,但我没有运行或使用API​​。最有可能你可以替代p - &gt; p,用于Function.identity()。并静态导入toMap(...)

答案 2 :(得分:5)

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

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