哪种方法参考可以简化这个lambda(Foo foo) - > foo.getName()?

时间:2017-02-03 06:21:24

标签: java lambda

我被问到如何简化这个lambda

(Foo foo) -> foo.getName()

有没有更好的方式来写它?

1 个答案:

答案 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()则不然。