gpt4 book ai didi

java - Spliterator 与 Stream.Builder

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:14:56 26 4
gpt4 key购买 nike

我读了一些关于如何创建有限的 Stream 的问题( Finite generated Stream in Java - how to create one? , How do streams stop? ).

建议实现 Spliterator 的答案。 Spliterator 将实现如何提供以及下一个提供哪个元素的逻辑 (tryAdvance)。但是还有另外两个非默认方法 trySplitestimateSize() 我必须实现。

Spliterator 的 JavaDoc 说:

An object for traversing and partitioning elements of a source. The source of elements covered by a Spliterator could be, for example, an array, a Collection, an IO channel, or a generator function. ... The Spliterator API was designed to support efficient parallel traversal in addition to sequential traversal, by supporting decomposition as well as single-element iteration. ...

另一方面,我可以实现如何围绕 Stream.Builder 前进到下一个元素并绕过 Spliterator 的逻辑。在每次前进时,我都会调用 acceptadd 并在最后调用 build。所以它看起来很简单。

JavaDoc 说了什么?

A mutable builder for a Stream. This allows the creation of a Stream by generating elements individually and adding them to the Builder (without the copying overhead that comes from using an ArrayList as a temporary buffer.)

使用 StreamSupport.stream 我可以使用 Spliterator 来获取 Stream。并且 Builder 将提供一个 Stream

我什么时候应该/可以使用 Stream.Builder
仅当 Spliterator 不会更高效时(例如,因为源无法分区且无法估计其大小)?

最佳答案

请注意,您可以扩展 Spliterators.AbstractSpliterator .那么,就只有tryAdvance来实现了。

所以实现一个Spliterator的复杂度并不高。

根本区别在于 SpliteratortryAdvance 方法仅在需要新元素时调用。相比之下,Stream.Builder 有一个存储,在您获取 Stream 之前,它将填充所有流元素。

因此,Spliterator 是各种惰性求值的首选,也是当您要遍历现有存储以避免复制数据时的首选。

构建器是元素创建不统一时的首选,无法表达按需创建元素。想一想您本来可以使用 Stream.of(...) 的情况,但事实证明它太不灵活了。

例如你有 Stream.of(a, b, c, d, e),但现在事实证明,cd 是可选的。所以解决方法是

Stream.Builder<MyType> builder = Stream.builder();
builder.add(a).add(b);
if(someCondition) builder.add(c).add(d);
builder.add(e).build()
/* stream operations */

其他用例是 this answer ,其中需要 Consumer 来查询现有的拆分器并将值推回到 Stream 之后,或者 this answer ,其中没有随机访问的结构(类层次结构)应该以相反的顺序流式传输。

关于java - Spliterator 与 Stream.Builder,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52336068/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com