Java8中的lambda特性是如何工作的?
我正在尝试使用Java8特性。在阅读时,我偶然发现了这个代码Java8中的lambda特性是如何工作的?,java,java-8,Java,Java 8,我正在尝试使用Java8特性。在阅读时,我偶然发现了这个代码 static void invoke(Runnable r) { r.run(); } static <T> T invoke(Callable<T> c) throws Exception { return c.call(); } 静态void调用(Runnable r){ r、 run(); } 静态T调用(可调用c)引发异常{ 返回c.call(); } 还有一个问题: 以下语句将调
static void invoke(Runnable r) {
r.run();
}
static <T> T invoke(Callable<T> c) throws Exception {
return c.call();
}
静态void调用(Runnable r){
r、 run();
}
静态T调用(可调用c)引发异常{
返回c.call();
}
还有一个问题:
以下语句将调用哪个方法?”
String s=invoke(()->“done”);
答案是
方法invoke(Callable)
将被调用,因为该方法返回一个值;方法invoke(Runnable)
不会。在这种情况下,lambda表达式()->“done”
的类型是可调用的
据我所知,由于invoke
应返回字符串,因此它调用Callable的invoke。但是,不确定它到底是如何工作的。让我们看看lambda
invoke(() -> "done");
事实上你只有
"done"
使lambda值兼容。lambda的主体(看起来不是可执行语句)隐式变为
{ return "done";}
现在,由于Runnable#run()
没有返回值,而Callable#call()
有返回值,因此将选择后者
说你写过
invoke(() -> System.out.println());
相反,lambda将被解析为类型为Runnable
的实例,因为没有可以用作返回值的表达式