executor.invokeAll() lambda 体没有 return
executor.invokeAll() lambda body does not return
这个想法是针对某种编译器的,我正在尝试实现一个启动另一个线程的 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 主体既不兼容值也不兼容 void。我尝试了各种更改和技巧,但没有结果。有什么帮助吗?
问题出在你的 lambda 的定义中...
{
try{
return future.get();
}
catch (Exception e){
e.printStackTrace();
}
}
现在,这对于快乐路径来说很好,它只是 return 来自未来的响应,但如果出现异常,此 lambda 将不会 return 值。你需要 return 来自异常情况的东西,或者抛出 RuntimeException。要做什么取决于您的用例 - 异常将停止处理整个流,但空值或默认值可能会污染您的流。
此外,通常最好不要捕获异常 - 将捕获保持在您可以处理的必要/最小集合。
异常抛出形式看起来像...
{
try{
return future.get();
}
catch (InterruptedException | ExecutionException e){
e.printStackTrace();
throw new RuntimeException(e)
}
}
看看你的 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 方法,也不能转换为具有 return 值的方法。
您应该在捕获处或 lambda 主体的末尾有一个 return 值。
这个想法是针对某种编译器的,我正在尝试实现一个启动另一个线程的 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 主体既不兼容值也不兼容 void。我尝试了各种更改和技巧,但没有结果。有什么帮助吗?
问题出在你的 lambda 的定义中...
{
try{
return future.get();
}
catch (Exception e){
e.printStackTrace();
}
}
现在,这对于快乐路径来说很好,它只是 return 来自未来的响应,但如果出现异常,此 lambda 将不会 return 值。你需要 return 来自异常情况的东西,或者抛出 RuntimeException。要做什么取决于您的用例 - 异常将停止处理整个流,但空值或默认值可能会污染您的流。
此外,通常最好不要捕获异常 - 将捕获保持在您可以处理的必要/最小集合。
异常抛出形式看起来像...
{
try{
return future.get();
}
catch (InterruptedException | ExecutionException e){
e.printStackTrace();
throw new RuntimeException(e)
}
}
看看你的 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 方法,也不能转换为具有 return 值的方法。
您应该在捕获处或 lambda 主体的末尾有一个 return 值。