在消费者函数抛出异常后,Spliterator是否应该可重用?

时间:2018-05-04 09:13:08

标签: java java-8 spliterator

Spliterator在其ConsumertryAdvance方法中采用任意forEachRemaining函数。

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

javadocs在这一点上含糊不清;他们只是说任何例外情况都会传播出去,而没有提到分裂者在该点之后的状态

1 个答案:

答案 0 :(得分: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基于集合/数组以这种方式工作。