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

时间:2014-09-05 18:55:47

标签: java java-8

我正在尝试使用java 8功能。在阅读official tutorial时,我遇到了这段代码

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

static <T> T invoke(Callable<T> c) throws Exception {
    return c.call();
}

并且有一个问题:

  

将在以下语句中调用哪种方法?&#34;

     

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

并回答它是

  

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

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

1 个答案:

答案 0 :(得分:14)

让我们来看看lambda

invoke(() -> "done");

你只有

的事实
"done"

使lambda 值兼容。 lambda的主体(看起来不是可执行语句)隐式变为

{ return "done";} 

现在,由于Runnable#run()没有返回值且Callable#call()没有,因此将选择后者。

说你写过

invoke(() -> System.out.println());

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