Java 使用者函数引发异常后,拆分器是否应可重用?
Java 使用者函数引发异常后,拆分器是否应可重用?,java,java-8,spliterator,Java,Java 8,Spliterator,Spliterator在其tryAdvance和forEachRemaining方法中使用任意的消费者函数 如果使用者抛出异常,拆分器的状态应该是什么?如果传递给foreachrestaining的消费者在10项之后抛出异常(然后传播并捕获),那么对拆分器中的tryAdvance的下一次调用是否应返回第11项,或者拆分器是否应在该点被视为无效 javadocs在这一点上模棱两可;他们只是说,任何异常都将被传播出去,而不涉及超过该点的拆分器状态我相信在失败之后,您不应该再进一步 拆分器停止工作,不
Spliterator
在其tryAdvance
和forEachRemaining
方法中使用任意的消费者
函数
如果使用者抛出异常,拆分器的状态应该是什么?如果传递给foreachrestaining
的消费者在10项之后抛出异常(然后传播并捕获),那么对拆分器中的tryAdvance
的下一次调用是否应返回第11项,或者拆分器是否应在该点被视为无效
javadocs在这一点上模棱两可;他们只是说,任何异常都将被传播出去,而不涉及超过该点的拆分器状态我相信在失败之后,您不应该再进一步 拆分器停止工作,不再遍历元素。即使还有剩余的元素 对于特定元素,
forEachRemaining
中出现异常意味着整个组的计算结束
横向和分离排气元件;每个拆分器仅用于单个批量计算
拆分器.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);
好吧,大多数基于集合/数组的拆分器都是这样工作的。更具体地说,大多数带有专用的foreachRestain实现的拆分器将其状态读入局部变量,然后改变实例状态以完全使用,在实际处理循环中使用局部变量之前。这样,无论处理过程中发生什么,都意味着完全消耗,即不需要专门处理异常。但是请记住,
estimateSize()
不需要反映遍历后更改的状态。
3
a
0