在 lambda 中使用 Executors.callable()

use Executors.callable() within lambda

我有以下有效的方法:

var tasks = tasks.stream(a -> (Callable<Set<FinishedTask>>) () -> call(a)).collect(Collectors.toList());

我想将上面的代码改成使用Executors.callable

// how to cast executor.callable?
var tasks = tasks.stream(t -> (Set<FinishedTask>)Executors.callable(()-> call(t))).collect(Collectors.toList());

但是,我得到编译器错误:

The method callable(Runnable) is ambiguous for the type Executors

演员有什么问题吗?

这里有两个问题。

首先出现这种类型的错误,java无法推断调用哪个方法。

Callable<?> c = Executors.callable( (PrivilegedAction) () -> "tested" );

通过使用强制转换,您可以告诉 java 使用 Executors.callable(PrivilegedAction) 而不是 Executors.callable(PrivilegedExceptionAction)。它们都具有相同的方法签名。 Runnable在这种情况下不会出错,因为它是void return类型。

其次,现在它会知道要使用哪个方法,但它仍在 returning Callable,因此您不能将其转换为集合。

Callable<Set<FinishedTask>> callable = () -> call(a);
Callable<Set<FinishedTask>> callable2 = Executors.callable(()-> call(t));

您正在尝试施放到一个集合。你需要打电话。

Set<FinishedTask> sft = Executors.callable(()-> call(t)).call();