Java 8 Streams - 在迭代过程中抛出异常

Bic*_*ick 2 exception java-8 java-stream

我有以下数组

ArrayList<Car> list = new ArrayList<>();
Run Code Online (Sandbox Code Playgroud)

我想迭代它并抛出异常,如果它包含一定的值

如果至少有一个

list.stream.filter(x -> x.color.equals("Black"));
Run Code Online (Sandbox Code Playgroud)

然后我想停止迭代并抛出异常.
有办法吗?

Ale*_* C. 8

你可以使用anyMatch这个:

boolean matched = list.stream().anyMatch(x -> x.color.equals("Black"));
if(matched) throw new SomeException();
Run Code Online (Sandbox Code Playgroud)

因为如果一个元素在迭代它时满足条件,它不会评估管道的其余部分,并且如果流是空的则它返回false,我认为这正是你要找的.

当然,您可以在一个语句中执行此操作,但根据具体情况,它可能无法提高可读性:

if(list.stream().anyMatch(x -> x.color.equals("Black"))) {
    throw new SomeException();
}
Run Code Online (Sandbox Code Playgroud)

  • 与`forEach`方法不同,这将允许您抛出已检查的异常. (6认同)

Chi*_*rlo 7

最简单的是:

list.forEach( x -> {
    if(x.color.equals("Black")) throw new RuntimeException();
});
Run Code Online (Sandbox Code Playgroud)

  • @rails:[`Iterable.forEach`](http://docs.oracle.com/javase/8/docs/api/java/lang/Iterable.html#forEach-java.util.function.Consumer-)没有创建一个`Stream`但也仅限于迭代,即不能与[`map`或`filter`等]结合使用(http://docs.oracle.com/javase/8/docs/api/的java/util的/流/包summary.html#package.description) (3认同)
  • 如果你使用这种方法,那么就不需要调用`stream()`.`list.forEach`就足够了. (2认同)