如何使用 :: 运算符作为参考
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
将具有 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