首页 > 解决方案 > 如果流没有返回结果,Java 8 会抛出异常

问题描述

我很好奇是否可以在以下情况下使用 orElseThrow() 或者是否有更多的 Java 8 方法可以将其等效为 1-liner?

Collection<Foo> foo = blah.stream().filter(somePredicate).collect(Collectors.toList());
if (foo.isEmpty()) {
  throw new Exception("blah");
}

标签: java

解决方案


你可以试试这个:

Collection<Foo> foo = blah.stream().filter(somePredicate)
    .collect(Collectors.collectingAndThen(Collectors.toList(), Optional::of))
    .filter(l -> !l.isEmpty())
    .orElseThrow(() -> new Exception("blah"))

请注意,与您的代码相比,这会分配一个额外的Optional实例。


推荐阅读