pfu*_*her 73 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()));
Run Code Online (Sandbox Code Playgroud)
似乎我应该能够使用lambda表达式来内联它,但我无法想出一个编译它的人.(我对lambdas很新,所以这并不奇怪.)
谢谢.
- >更新:
如接受的答案所述
Person::getLast
Run Code Online (Sandbox Code Playgroud)
是我在寻找的东西,也是我尝试过的东西.然而,Eclipse 4.3的BETA_8每晚构建是问题 - 它标记为错误.从命令行编译时(我应该在发布之前完成),它起作用了.所以,是时候用eclipse.org提交bug了.
谢谢.
ass*_*ias 181
你可以使用lambda:
Collectors.toMap(p -> p.getLast(), Function.identity())
Run Code Online (Sandbox Code Playgroud)
或者,更简洁,您可以使用方法参考使用:::
Collectors.toMap(Person::getLast, Function.identity())
Run Code Online (Sandbox Code Playgroud)
而不是Function.identity,你可以简单地使用等效的lambda:
Collectors.toMap(Person::getLast, p -> p)
Run Code Online (Sandbox Code Playgroud)
如果您使用Netbeans,只要匿名类可以被lambda替换,您就应该得到提示.
aep*_*iet 29
List<Person> roster = ...;
Map<String, Person> map =
roster
.stream()
.collect(
Collectors.toMap(p -> p.getLast(), p -> p)
);
Run Code Online (Sandbox Code Playgroud)
这将是翻译,但我没有运行或使用API.很可能你可以用p - > p代替Function.identity().并静态导入到地图(...)
在相同的密钥冲突的情况下,我们也可以使用可选的合并功能.例如,如果两个或更多人具有相同的getLast()值,我们可以指定如何合并这些值.如果我们不这样做,我们可能会得到IllegalStateException.以下是实现此目的的示例......
Map<String, Person> map =
roster
.stream()
.collect(
Collectors.toMap(p -> p.getLast(),
p -> p,
(person1, person2) -> person1+";"+person2)
);
Run Code Online (Sandbox Code Playgroud)