为什么带有返回类型的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的分配失败,因为我的消费方法与使用者接口中的accept方法不匹配-返回类型不同,字符串与无效。
此外,我一直认为Lambda表达式与方法引用之间存在一对一的关系,但是正如我的示例所示,事实显然并非如此。
有人可以向我解释这里发生了什么吗?
回答:
consume(String)
方法匹配Consumer<String>
接口,因为它消耗了String
-返回值的事实是不相关的,因为-在这种情况下-它被忽略了。(因为Consumer接口根本不希望有任何返回值)。
它必须是一种设计选择,并且基本上是一种实用程序:想象一下必须重构或复制多少种方法,才能满足功能接口(例如Consumer
甚至是非常常见的接口)的需求Runnable
。(请注意,例如,你可以将任何不占用任何参数的方法传递Runnable
给Executor
,)。
甚至方法都java.util.List#add(Object)
返回值:boolean
。仅仅因为它们返回了某些东西(在许多情况下大多数情况下是不相关的)而无法传递此类方法引用会很烦人。
以上是 为什么带有返回类型的Java方法引用与Consumer接口匹配? 的全部内容, 来源链接: utcz.com/qa/429387.html