【发布时间】:2018-08-14 19:32:53
【问题描述】:
我得到了这个小代码来测试Callable。但是,我发现编译器如何知道 Lambda 是用于接口 Callable 还是 Runnable 非常令人困惑,因为它们的函数中都没有任何参数。
然而,IntelliJ 显示 Lambda 使用 Callable 的代码。
public class App {
public static void main(String[] args) throws InterruptedException {
ExecutorService executorService = Executors.newCachedThreadPool();
executorService.submit(() ->{
System.out.println("Starting");
int n = new Random().nextInt(4000);
try {
Thread.sleep(n);
} catch (InterruptedException e) {
e.printStackTrace();
}finally {
System.out.println("Finished");
}
return n;
});
executorService.shutdown();
executorService.awaitTermination(1, TimeUnit.MINUTES );
}
}
【问题讨论】:
-
它返回一个结果,Runnable 没有,所以它是一个 Callable。
-
语言规范中的关键短语是“void compatible”和“value compatible”。
-
@Michael 这是一个简单的解释:您可以使用一些将返回值作为可运行对象的 lambda(例如
() -> Integer.valueOf(0)),在这种情况下,返回值将被丢弃。 -
@AndyTurner 那是一个表达式 lambda,OP 没有使用,规则不同。您不能编写关键字
return并忽略结果。
标签: java multithreading lambda java-8 functional-interface