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