我被问到如何简化这个lambda
(Foo foo) -> foo.getName()
有没有更好的方式来写它?
答案 0 :(得分:2)
Foo::getName
。
假设getName
是一个在其签名中带有空参数列表的实例方法,那么效果是使用类Foo
的一个参数创建一个匿名方法,使用该参数作为"目标参考"实例方法调用,即方法调用适用的对象。也就是说,它创建了一个方法
return-type anonymousMethod(Foo arg) {
return arg.getName();
}
这正是(Foo foo) -> foo.getName();
的作用。
另一方面,这个方法参考:
abc::getName()
使用 no 参数创建一个匿名方法,返回abc.getName()
,其中abc
在lambda之外定义。
编辑:我刚刚意识到这个答案并不完全正确;在(Foo foo) -> foo.getName()
无法简化为Foo::getName
的情况下。当Foo
声明两个看起来像这样的方法时,会发生这种情况:
public String getName() { ... }
public static String getName(Foo foo) { ... }
现在Foo::getName
含糊不清(因而非法),而(Foo foo) -> foo.getName()
则不然。