首页 > 解决方案 > 在 lambda 中使用 Executors.callable()

问题描述

我有以下工作:

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

演员阵容有什么问题?

标签: javajava.util.concurrent

解决方案


你这里有两个问题。

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

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

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

其次,现在它会知道要使用哪个方法,但它仍然返回一个 Callable,所以你不能将它强制转换为一个集合。

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

您正在尝试投射到一组。你需要打电话。

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

推荐阅读