如果流未返回任何结果,Java8将引发异常

如果流未返回任何结果,Java8将引发异常,java,Java,我很好奇,在以下情况下是否可以使用orElseThrow,或者是否有更多的Java8方法来实现与1-liner相同的功能 Collection<Foo> foo = blah.stream().filter(somePredicate).collect(Collectors.toList()); if (foo.isEmpty()) { throw new Exception("blah"); } 你可以试试这个: Collection<Foo> foo = bla

我很好奇,在以下情况下是否可以使用orElseThrow,或者是否有更多的Java8方法来实现与1-liner相同的功能

Collection<Foo> foo = blah.stream().filter(somePredicate).collect(Collectors.toList());
if (foo.isEmpty()) {
  throw new Exception("blah");
}
你可以试试这个:

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

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

也许Collectors.collectingAndThen方法会有所帮助。明白了,谢谢。我想我会坚持原版,但知道这个选项存在是件好事