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