不兼容的类型:错误的 return lambda 表达式类型 | void 不是功能接口

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

我正在研究 Java 8 个功能并使用 Jshell 来探索它。我尝试 运行 以下命令:

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

但失败并出现以下错误:

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

我不明白消费者接受一个参数而 return 什么都没有的问题到底是什么。我在这里通过传递 1 arg str 和打印来做同样的事情。那么这个语法有什么问题呢。

谢谢,

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

如果你想使用lambda表达式,

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

如果需要方法参考,

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

如果你想要一个 Consumer<String> 打印给它的字符串,它可以是调用 System.out::println:

的 lambda 表达式
Consumer<String> consumer = (str)->System.out.println(str);

或对 System.out::println

的方法引用
Consumer<String> consumer = System.out::println;

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

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

但这种间接性非常少见。