这个想法适用于某种编译器,我正在尝试实现一个启动另一个线程的fork语句。 代码:
List < Callable < CustomClass >> callList = lista.stream().map(p -> (Callable < CustomClass > )() -> p.oneStep()).collect(Collectors.toList()); //here I just prepared the list of callables
List < CustomClass > newPrgs;
try {
newPrgs = executor.invokeAll(callList).stream().map(future -> {
try {
return future.get();
} catch (Exception e) {
e.printStackTrace();
}
}
/here it indicates the error/.filter(p -> p != null).collect(Collectors.toList());
} catch (InterruptedException e) {
throw new CustomException(e.getMessage());
}
错误是:lambda body既不是值也不是void兼容。我尝试了各种变化和技巧,没有结果。有些帮忙吗?
答案 0 :(得分:1)
问题在于你的lambda的定义......
ptr
现在,这对于快乐路径来说很好,它只返回未来的响应,但是如果发生异常,这个lambda将不会返回值。您需要从异常情况返回一些内容,或者抛出RuntimeException。要做什么取决于您的用例 - 异常将阻止整个流处理,但null或默认值可能会污染您的流。
此外,通常最好不要捕获异常 - 将捕获量保持在您可以处理的最小集合之下。
抛出异常的表格看起来像......
{
try{
return future.get();
}
catch (Exception e){
e.printStackTrace();
}
}
答案 1 :(得分:1)
看看你的lambda的身体:
try {
return future.get(); // This branch returns a value
} catch (Exception e) {
e.printStackTrace(); // No return statement here
}
// No return statement here either
因此,您的lambda既不能转换为void方法,也不能转换为具有返回值的方法。
你应该在lambda体的catch或末尾有一个返回值。