在 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();
我有以下有效的方法:
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();