为什么 Spliterators.spliteratorUnknownSize() 不是后期绑定?

Why is Spliterators.spliteratorUnknownSize() not late-binding?

我今天阅读了有关拆分器的内容,并使用 Spliterators.spliteratorUnknownSize(iterator(), Spliterator.NONNULL) 实现了一个。根据 spliteratorUnknownSize() 的文档

The [resulting] spliterator is not late-binding

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

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

根据 javadocs:

"A Spliterator that does not report IMMUTABLE or CONCURRENT is expected to have a documented policy concerning: when the Spliterator binds to the element source; and detection of structural interference of the element source detected after binding. A late-binding Spliterator binds to the source of elements at the point of first traversal, first split, or first query for estimated size, rather than at the time the Spliterator is created. A Spliterator that is not late-binding binds to the source of elements at the point of construction or first invocation of any method. Modifications made to the source prior to binding are reflected when the Spliterator is traversed. After binding a Spliterator should, on a best-effort basis, throw ConcurrentModificationException if structural interference is detected. ..."

因此,如果您仔细分析,late-bindingnon-late-binding 的真正区别在于何时检测到结构干扰英寸

一个 Spliterator 包装一个 任意 迭代器不能保证检测到结构干扰。这取决于 Iterator 是如何实现的。即使 Iterators 检测(或减轻)结构干扰,Spliterator 也无法保证检测何时开始;即当 "binding" 发生时。

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


If I ensure iterator() to be late-binding, the resulting Spliterator should also be, no?

javadocs 不保证这一点。

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


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