Java8中的lambda特性是如何工作的?

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(); } 还有一个问题: 以下语句将调

我正在尝试使用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();
}
还有一个问题:

以下语句将调用哪个方法?”

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
的实例,因为没有可以用作返回值的表达式