在 Consumer 函数抛出异常后,Spliterator 是否可以重用?
Should a Spliterator be reusable after an exception is thrown by the Consumer function?
Spliterator
在其 tryAdvance
和 forEachRemaining
方法中采用任意 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
都是以这种方式工作的。
Spliterator
在其 tryAdvance
和 forEachRemaining
方法中采用任意 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
都是以这种方式工作的。