【问题标题】:incompatible types: bad return type in lambda expression | void is not a functional interface不兼容的类型:lambda 表达式中的错误返回类型 | void 不是功能接口
【发布时间】:2021-05-01 07:11:39
【问题描述】:

我正在浏览 Java 8 Feature 并使用 Jshell 来探索它。我尝试运行以下命令:

Consumer<String> consumer = (str)->System.out::println;

但它失败并出现以下错误:

Error:
|  incompatible types: bad return type in lambda expression
|      void is not a functional interface

我不明白消费者接受一个参数但什么也不返回的确切问题。同样,我在这里通过传递 1 arg str 并打印。那么这种语法有什么问题。

谢谢,

【问题讨论】:

    标签: java lambda java-8 consumer functional-interface


    【解决方案1】:

    如果你想要一个 Consumer&lt;String&gt; 来打印给它的字符串,它可以是一个调用 System.out::println 的 lambda 表达式:

    Consumer<String> consumer = (str)->System.out.println(str);
    

    或对System.out::println的方法引用

    Consumer<String> consumer = System.out::println;
    

    但不是两者。您似乎混淆了语法。 str -&gt; System.out::println 将是一个 lambda 表达式,它接受一个对象,忽略它,并返回一个对 System.out::println 的方法引用。例如,您可以这样做:

    Function<Object, Consumer<String>> func = str -> System.out::println;
    

    但这种间接性非常少见。

    【讨论】:

      【解决方案2】:

      您将 lambda 表达式与方法引用混合在一起。

      如果你想使用 lambda 表达式,

      Consumer<String> consumer = str -> System.out.println(str);
      

      如果你想要一个方法参考,

      Consumer<String> consumer = System.out::println;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-10-09
        • 1970-01-01
        • 2015-07-22
        • 2021-04-15
        • 1970-01-01
        • 2021-11-01
        • 1970-01-01
        相关资源
        最近更新 更多