如何使用 :: 运算符作为参考

How to use :: operator as this reference

将具有 id 的对象列表 Foo 转换为以 id 作为键的 Map<Integer,Foo>,使用流 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

虽然它不是方法参考,但 Function.identity() 是您需要的:

Map<Integer,Foo> myMap = 
    fooList.stream().collect(Collectors.toMap(Foo::getId, Function.identity()));

您可以使用 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));

Function.identity()x -> x 之间有区别 here 解释得很好,但有时我更喜欢第二种;它不那么冗长,当管道复杂时我倾向于使用:x -> x