java 8中的lambda特性如何工作?

wou*_*non 7 java java-8

我正在尝试使用java 8功能.在阅读官方教程时,我遇到了这段代码

static void invoke(Runnable r) {
    r.run();
}

static <T> T invoke(Callable<T> c) throws Exception {
    return c.call();
}
Run Code Online (Sandbox Code Playgroud)

并且有一个问题:

将在以下语句中调用哪种方法?"

String s = invoke(() -> "done");

并回答它

该方法invoke(Callable<T>)将被调用因为该方法返回的值; 方法invoke(Runnable)没有.在这种情况下,lambda表达式的类型() -> "done"Callable<T>.

据我所知,因为invoke预期返回a String,它会调用Callable的调用.但是,不确定它是如何工作的.

Sot*_*lis 14

我们来看看lambda

invoke(() -> "done");
Run Code Online (Sandbox Code Playgroud)

事实上你只有

"done"
Run Code Online (Sandbox Code Playgroud)

使lambda 值兼容.lambda的主体,似乎不是一个可执行语句,隐含地变成了

{ return "done";} 
Run Code Online (Sandbox Code Playgroud)

现在,既然Runnable#run()没有返回值,Callable#call()那么将选择后者.

说你写了

invoke(() -> System.out.println());
Run Code Online (Sandbox Code Playgroud)

相反,lambda将被解析为一个类型的实例Runnable,因为没有可以用作返回值的表达式.