Spliterator在其tryAdvance和forEachRemaining方法中接受任意的Consumer函数。
如果使用者抛出异常,分配器的状态应该是什么?如果传递给forEachRemaining的使用者在10个项之后抛出一个异常(然后将其传播出去并捕获),那么在分配器中对tryAdvance的下一次调用应该返回第11项,还是应该认为分割器在这一点上已死&无效?
javadocs在这一点上是模棱两可的;他们只是说任何异常都会被传播出去,而没有引用过分配器的状态。
发布于 2018-05-04 10:24:08
我相信你不应该在失败之后走得更远。
分配器停止其工作,不再对元素进行迭代。即使还有剩余的元素。
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
0AFAIK,大多数基于集合/数组的Spliterator都是这样工作的。
https://stackoverflow.com/questions/50171346
复制相似问题