首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在使用者函数抛出异常后,Spliterator是否应该可重用?

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

Stack Overflow用户
提问于 2018-05-04 09:13:07
回答 1查看 175关注 0票数 5

Spliterator在其tryAdvanceforEachRemaining方法中接受任意的Consumer函数。

如果使用者抛出异常,分配器的状态应该是什么?如果传递给forEachRemaining的使用者在10个项之后抛出一个异常(然后将其传播出去并捕获),那么在分配器中对tryAdvance的下一次调用应该返回第11项,还是应该认为分割器在这一点上已死&无效?

javadocs在这一点上是模棱两可的;他们只是说任何异常都会被传播出去,而没有引用过分配器的状态。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-05-04 10:24:08

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

分配器停止其工作,不再对元素进行迭代。即使还有剩余的元素。

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

遍历和拆分排气元素;每个Spliterator只用于单个批量计算。

一个Spliterators.ArraySpliterator如何处理这个问题的例子。

代码语言:javascript
复制
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);
代码语言:javascript
复制
3
a
0

AFAIK,大多数基于集合/数组的Spliterator都是这样工作的。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50171346

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档