supplyAsync()期望一个,
Supplier<U>而您给它一个
Callable。
错误消息告诉您,编译器已尝试找到用于“
U您
SampleTask的a”的类型
Supplier<U>,但找不到该类型。
Java将把lambda隐式“提升”到功能接口(例如
Callable或)
Supplier。但是它不会将功能接口视为可互换的-
也就是说,您不能
Callable在
Supplier期望的位置使用a 。
您可以就地制作合适的lambda:
SimpleTask task = new SimpleTask();CompletableFuture.supplyAsync(() -> task.call());
请注意,如果
SimpleTask的
call()是,这是可行的:
public Double call() { // note no exception declared return 0d; }这样的事实
SimpleTask发生在执行
Callable不相关的上面的代码。
如果您希望此代码与任意值一起使用
Callable,或者您声明
task为
Callable:
Callable callable = new SimpleTask();CompletableFuture.supplyAsync(() -> callable.call());
…然后您将收到有关未捕获的异常的编译器错误。您的lambda将需要捕获并处理该异常(可能作为未检查的异常重新抛出,如其他答案所述)。
或者您可以制作
SampleTask工具
Supplier<Double>。
lambda的部分动机是因为写
Callable得太冗长。因此,您可能会忽略中产阶级而直接去:
CompleteableFuture<Double> future = CompletableFuture.supplyAsync(() -> 0d);
这也适用于更复杂的供应商:
CompleteableFuture<Double> future = CompletableFuture.supplyAsync(() -> { Foo foo = slowQuery(); return transformToDouble(foo);});


