java - 哪个方法引用可以简化这个 lambda (Foo foo) -> foo.getName()?

标签 java lambda

有人问我如何简化这个 lambda

(Foo foo) -> foo.getName()

还有更好的写法吗?

最佳答案

Foo::getName

假设getName是一个实例方法,其签名中的参数列表为空,那么效果是创建一个带有Foo类的一个参数的匿名方法,使用该参数作为实例方法调用的“目标引用”,即方法调用适用的对象。也就是说,它创建了一个方法

return-type anonymousMethod(Foo arg) {
    return arg.getName();
}

这正是 (Foo foo) -> foo.getName(); 所做的。

另一方面,这个方法引用:

abc::getName()

创建一个没有参数的匿名方法,该方法返回 abc.getName(),其中 abc 在 lambda 外部定义。 p>

编辑:我刚刚意识到这个答案并不完全正确;在某些情况下,(Foo foo) -> foo.getName() 不能简化为Foo::getName。当 Foo 声明两个如下所示的方法时,就会发生这种情况:

public String getName() { ... }
public static String getName(Foo foo) { ... }

现在 Foo::getName 是不明确的(因此是非法的),而 (Foo foo) -> foo.getName() 则不是。

关于java - 哪个方法引用可以简化这个 lambda (Foo foo) -> foo.getName()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42017991/

相关文章:

java - 井字棋中的领带方法怎么写?

java - 生产中的 Liferay 设置

java - Stream 在顺序模式下工作,但在并行模式下有问题

c# - 改变谓词的表达式树以针对另一种类型

c# - 基于 <T> 类型在运行时动态创建 lambda 谓词

java - 从 EL 执行和对象的方法

java - 为什么存在这样的方法时会抛出 `NoSuchMethodException`?

java - Tomcat:自定义错误页面而不是空响应

lambda - 在 Kotlin 中将比较器转换为 lambda

java - 简单 lambda 表达式代码的 "AssignmentOperator Expression"错误