为什么返回类型的Java方法引用与Consumer接口匹配?

为什么返回类型的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表达式和方法引用之间存在一对一的关系,但显然并非如我的示例所示。

有人可以向我解释这里发生了什么吗?


茅侃侃
浏览 782回答 3
3回答

隔江千里

consume(String)方法匹配Consumer<String>接口,因为它消耗了一个String- 它返回一个值是无关紧要的事实,因为 - 在这种情况下 - 它被简单地忽略。(因为Consumer接口根本不期望任何返回值)。它必须是一个设计选择,基本上是一个实用程序:想象有多少方法需要重构或重复以匹配功能接口的需求,Consumer甚至是非常常见的功能接口Runnable。(请注意,您可以将任何不使用参数的方法传递Runnable给Executor,例如。)甚至像java.util.List#add(Object)返回值的方法:boolean。由于它们返回某些东西(在许多情况下几乎不相关)而无法传递此类方法引用会相当烦人。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java