此表达式的目标类型必须是 MethodReferences 中的功能接口

The target type of this expression must be a functional interface in MethodReferences

为什么下面的代码编译不通过。

Consumer con = (s) -> System.out::println;

它说

The target type of this expression must be a functional interface

尽管 Consumer 是一个函数式接口。下面的工作正常。

Consumer con2 = (s) -> {System.out.println(s);};

因为那是一个方法参考,所以用法有点不同:

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

消费者接受的参数 (s) 仍将传递给 println 方法。

here 是 Oracle 的教程。

Consumer con = (s) -> System.out::println;

在这里,您尝试使用我们在 Java 中称为 方法引用 的方法调用 System.out.println() 8. 当您要引用一个lambda 表达式中的方法必须是这样的,

Consumer con = System.out::println;

您实际上不需要 s 来调用 println 方法。方法参考将解决这个问题。此 :: 运算符意味着您将使用参数调用 println 方法,并且您不会指定其名称。

但是当你这样做时,

Consumer con2 = (s) -> {System.out.println(s);};

您是在告诉 lambda 表达式显式打印 s 的内容,这在技术上完全没问题,因此不会出现任何编译错误。