Spliterator
在其Consumer
和tryAdvance
方法中采用任意forEachRemaining
函数。
如果消费者抛出异常,分裂者的状态应该是什么?如果传递给forEachRemaining
的消费者在10个项目之后抛出异常(然后传播出来并被捕获),那么下一个对分裂器中的tryAdvance
的调用是否应该返回第11个项目,或者分裂器应该是被认为死了那时无效?
javadocs在这一点上含糊不清;他们只是说任何例外情况都会传播出去,而没有提到分裂者在该点之后的状态
答案 0 :(得分:3)
我相信在失败之后你不应该走得更远。
分裂器停止工作,不再迭代元素。即使有剩余的元素。
forEachRemaining
中特定元素的异常意味着整个组的计算结束。
遍历和分离排气元件;每个Spliterator仅对单个批量计算有用。
Spliterators.ArraySpliterator
处理此问题的示例。
Spliterator<String> spliterator = Arrays.asList("a", "b", "c").spliterator();
System.out.println(spliterator.estimateSize());
try {
spliterator.forEachRemaining(s -> {
if (s.equals("b")) {
throw new IllegalArgumentException();
}
System.out.println(s);
});
} catch (IllegalArgumentException e) {}
System.out.println(spliterator.estimateSize());
spliterator.forEachRemaining(System.out::println);
3
a
0
AFAIK,大多数Spliterator
基于集合/数组以这种方式工作。