Collectors.toMap()keyMapper – 更简洁的expression式?

我想在下面的“Collectors.toMap()”调用中为“keyMapper”函数参数提供一个更简洁的expression式:

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())); 

看来我应该能够使用lambdaexpression式来embedded它,但我不能拿出一个编译。 (我对lambda非常陌生,所以这并不令人意外。)

谢谢。

– >更新:

正如接受的答案中指出的那样

 Person::getLast 

是我一直在寻找的,而且是我曾经尝试过的。 然而,Eclipse 4.3的夜晚版本是个问题 – 它标记为错误的。 从命令行编译(我应该在发布之前完成),它工作。 那么,现在是时候用eclipse.org提交一个bug了。

谢谢。

你可以使用lambda:

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

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

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

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

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

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

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

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

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

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