如何在嵌套的lambdas无法到达最里面的范围时抛出异常?

时间:2017-10-18 04:25:34

标签: java lambda

我希望嵌套一些lambdas,如果未达到最内层范围,则抛出异常。怎么办呢?

boolean someError = true;

procA(new Object()).ifPresent(a -> {
   procB(a).ifPresent(b -> {
      System.out.println(a);
      System.out.println(b);

      // Can't do this: "Local variable someError in an enclosing scope must
      // be final or effectively final"
      someError = false;
   });
});

if (someError)
   throw new RuntimeException("Some error!");

这与我的其他问题类似:How to chain lambdas with all optional values available at the innermost scope without nesting Optional#ifPresent()?

不同之处在于允许嵌套ifPresent()。仍然不允许使用get()以避免在无法检查可选的isPresent()的值时是否存在潜在的运行时异常。

1 个答案:

答案 0 :(得分:0)

我完全相信你正在使用错误的方法来做你想做的事情。一般来说,争论java中的方法是否应该返回Optionals。我相信它们只应该在一个完全避免null的项目中。

在不知道procA和procB究竟发生了什么的情况下,很难推断重构这个更好。我的猜测是procA和procB之间的封装和抽象并不理想。

如果没有更大的重构,这可能会使它工作:

Optional<ReturnOfProcB> result = procA(paramA).map(this::procB);
if(!result.isPresent()) {
    throw new IllegalStateException(); 
}