将具有Foo
的对象列表id
转换为以Map<Integer,Foo>
为关键字的id
,使用流API很容易:
public class Foo{
private Integer id;
private ....
getters and setters...
}
Map<Integer,Foo> myMap =
fooList.stream().collect(Collectors.toMap(Foo::getId, (foo) -> foo));
有没有办法用lambda表达式替换(foo) -> foo
使用::
运算符?像Foo::this
答案 0 :(得分:7)
虽然它不是方法参考,但您需要Function.identity()
:
Map<Integer,Foo> myMap =
fooList.stream().collect(Collectors.toMap(Foo::getId, Function.identity()));
答案 1 :(得分:6)
您可以使用Function.identity()
替换foo -> foo
lambda。
如果你真的想要说明方法参考,你可以编写一个无意义的方法
class Util {
public static <T> T identity(T t) { return t; }
}
并通过方法参考Util::identity
引用它:
( ... ).stream().collect(Collectors.toMap(Foo::getId, Util::identity));
答案 2 :(得分:4)
Function.identity()
和x -> x
之间存在差异,因为非常好解释here,但有时候我赞成第二种情况;它不那么冗长,当管道变得复杂时,我倾向于使用:x -> x