为什么以下代码无法编译。
Consumer con = (s) -> System.out::println;
它说
此表达式的目标类型必须是功能接口
尽管Consumer是一个功能界面。以下工作正常。
Consumer con2 = (s) -> {System.out.println(s);};
答案 0 :(得分:11)
因为这是方法参考,所以用法略有不同:
Consumer<String> c = System.out::println;
消费者采用的参数(s
)仍将传递给println
方法。
here是Oracle关于此的教程。
答案 1 :(得分:10)
Consumer con = (s) -> System.out::println;
在这里,您尝试在Java 8中使用我们称之为方法引用的方式调用System.out.println()
。当您在lambda表达式中引用方法时必须是这样的,
Consumer con = System.out::println;
您实际上并不需要s
来调用println
方法。方法参考将负责这一点。这个::
运算符意味着您将使用参数调用println
方法,并且您不会指定其名称。
但是当你这样做时,
Consumer con2 = (s) -> {System.out.println(s);};
你告诉lambda表达式明确打印出s
的内容,这在技术上是非常好的,所以它不会出现任何编译错误。