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 值。