如何使用:: operator作为此引用

时间:2017-10-10 08:27:58

标签: java lambda java-8 method-reference

将具有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

这样的东西

3 个答案:

答案 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