为什么返回类型的Java方法引用与Consumer接口匹配?我对以下代码感到困惑class LambdaTest {
public static void main(String[] args) {
Consumer<String> lambda1 = s -> {};
Function<String, String> lambda2 = s -> s;
Consumer<String> lambda3 = LambdaTest::consume; // but s -> s doesn't work!
Function<String, String> lambda4 = LambdaTest::consume;
}
static String consume(String s) { return s;}}我原本期望lambda3的赋值失败,因为我的consume方法与Consumer Interface中的accept方法不匹配 - 返回类型不同,String与void。此外,我一直认为Lambda表达式和方法引用之间存在一对一的关系,但显然并非如我的示例所示。有人可以向我解释这里发生了什么吗?
3 回答
隔江千里
TA贡献1906条经验 获得超10个赞
consume(String)
方法匹配Consumer<String>
接口,因为它消耗了一个String
- 它返回一个值是无关紧要的事实,因为 - 在这种情况下 - 它被简单地忽略。(因为Consumer
接口根本不期望任何返回值)。
它必须是一个设计选择,基本上是一个实用程序:想象有多少方法需要重构或重复以匹配功能接口的需求,Consumer
甚至是非常常见的功能接口Runnable
。(请注意,您可以将任何不使用参数的方法传递Runnable
给Executor
,例如。)
甚至像java.util.List#add(Object)
返回值的方法:boolean
。由于它们返回某些东西(在许多情况下几乎不相关)而无法传递此类方法引用会相当烦人。
添加回答
举报
0/150
提交
取消