我对以下代码感到困惑
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接口根本不希望有任何返回值)。
consume(String)
Consumer<String>
String
它必须是一种设计选择,并且基本上是一种实用程序:想象一下必须重构或复制多少种方法,才能满足功能接口(例如Consumer甚至是非常常见的接口)的需求Runnable。(请注意,例如,你可以将任何不占用任何参数的方法传递Runnable给Executor,)。
Consumer
Runnable
Executor
甚至方法都java.util.List#add(Object)返回值:boolean。仅仅因为它们返回了某些东西(在许多情况下大多数情况下是不相关的)而无法传递此类方法引用会很烦人。
java.util.List#add(Object)
boolean