在 Consumer 函数抛出异常后,Spliterator 是否可以重用?

Should a Spliterator be reusable after an exception is thrown by the Consumer function?

Spliterator 在其 tryAdvanceforEachRemaining 方法中采用任意 Consumer 函数。

如果消费者抛出异常,拆分器的状态应该是什么?如果传递给 forEachRemaining 的消费者在 10 个项目(然后传播出去并被捕获)后抛出异常,那么下一次调用拆分器 return 中的 tryAdvance 应该是第 11 个项目,还是应该spliterator 在那个时候被认为是死的和无效的?

javadoc 在这一点上含糊不清;他们只是说任何异常都将被传播出去,而没有参考拆分器在该点之后的状态

我相信你不应该在失败后走得更远。

拆分器停止工作,不再遍历元素。即使还有剩余的元素。

forEachRemaining 中特定元素的异常意味着整个组的计算结束。

Traversal and splitting exhaust elements; each Spliterator is useful for only a single bulk computation.

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

据我所知,大多数基于 collection/array 的 Spliterator 都是以这种方式工作的。