5

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

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

javadocs 在这一点上是模棱两可的。他们只是说任何异常都将被传播出去,而没有参考拆分器在该点之后的状态

4

1 回答 1

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基于集合/数组的 s 都以这种方式工作。

于 2018-05-04T10:24:08.883 回答