我正试图在以下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了。
感谢。
答案 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)
);