6

我今天阅读了拆分器并使用Spliterators.spliteratorUnknownSize(iterator(), Spliterator.NONNULL). 根据spliteratorUnknownSize()的文档

[resulting] 拆分器不是后期绑定

作为分离器的新手,我想知道为什么会这样。如果我确保iterator()是后期绑定,那么生成的拆分器也应该是,不是吗? spliteratorUnknownSize()只是创建一个IteratorSpliterator尚未绑定到元素源的对象。

即,我很想了解为什么生成的拆分器不是后期绑定的。谢谢你。

4

1 回答 1

3

根据javadocs

Spliterator没有报告IMMUTABLECONCURRENT预期有关于以下方面的书面政策:何时Spliterator与元素源结合;以及检测结合后检测到的元素源的结构干扰。后期结合Spliterator在该点与元素源结合估计大小的第一次遍历、第一次拆分或第一次查询,而不是在Spliterator创建时。Spliterator非后期绑定的 A 在构造点或任何方法的第一次调用时绑定到元素的源。所做的修改到绑定之前的源在Spliterator遍历时被反射。绑定后,Spliterator应该尽最大努力,如果检测到结构干扰,则抛出ConcurrentModificationException。......“

因此,如果您仔细分析,后期绑定非后期绑定实际上是关于何时检测结构干扰。

Spliterator包装任意迭代器不能保证检测到结构干扰。这取决于如何Iterator实施。即使Iterators确实检测(或减轻)结构干扰,Spliterator也无法保证检测何时开始;即当“绑定”发生时。

简而言之,它不能保证真正的后期绑定语义。


如果我确保iterator()后期绑定,结果Spliterator也应该是,不是吗?

javadocs 不保证这一点。

在实践中:它可能应该是,尽管它取决于 Spliterators. 但是在 javadocs 中做出这样的声明可能会以有害的方式限制类及其嵌套类的未来版本的实现。Spliterators


你可能不同意我的分析。然而,javadocs 的作者已经明确而有意地声明这些Spliterators不是后期绑定的。如果您认为他们对此有误,请针对 javadocs 提出错误报告。

于 2019-01-12T01:33:52.897 回答