代码之家  ›  专栏  ›  技术社区  ›  LuCio

分离器vs流生成器

  •  7
  • LuCio  · 技术社区  · 6 年前

    Stream ( Finite generated Stream in Java - how to create one? , How do streams stop?

    答案建议实施 Spliterator . 这个 分离器 下一步将实现如何和提供哪个元素的逻辑( tryAdvance trySplit estimateSize() 我必须实施。

    的JavaDoc 说:

    用于遍历和划分源元素的对象。元素的来源 例如,可以是一个数组 Collection ,IO通道或生成器函数。。。这个 遍历除顺序遍历外,通过支持 分解和单元素迭代。。。

    另一方面,我可以实现如何在一个 Stream.Builder 绕过a . 每提前一次我都会打电话 accept add 最后呢 build . 所以看起来很简单。

    JavaDoc怎么说?

    溪流 溪流 Builder (无需使用 ArrayList 作为一个 临时缓冲区。)

    使用 StreamSupport.stream 我可以用一个 获得 溪流 建设者 溪流 .

    流生成器
    只有在 会不会更有效(例如,因为无法对源进行分区,并且无法估计其大小)?

    2 回复  |  直到 6 年前
        1
  •  7
  •   Holger    6 年前

    请注意,您可以扩展 Spliterators.AbstractSpliterator . 那么,只有 tryAdvance 实施。

    Spliterator

    根本的区别在于 tryAdvance公司 方法仅在需要新元素时调用。相比之下 Stream.Builder 有一个 存储

    所以 分离器

    当元素的创建不一致时,生成器是首选,因此不能按需表示元素的创建。想一想你可能会用到的情况 Stream.of(…) ,但事实证明它是不灵活的。

    Stream.of(a, b, c, d, e) ,但现在发现, c d

    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 ,其中没有随机访问的结构(类层次结构)应以相反的顺序进行流式处理。

        2
  •  3
  •   John Bollinger    6 年前

    accept add build . 所以看起来很简单。

    是的,不是。是的 很简单,但我认为您不了解使用模式:

    流生成器有一个生命周期,它从构建阶段开始,在构建阶段可以添加元素,然后过渡到构建阶段,在构建阶段之后可以不添加元素。构建阶段开始于 build() Stream 其元素是按添加顺序添加到流生成器的元素。

    ( Javadocs )

    尤其是不,你不会调用 Stream.Builder 接受 添加 任何流前进的方法。您需要提供流的所有对象 在里面 生成() 获取一个流,该流将提供您以前添加的所有对象。这类似于将所有对象添加到 List 列表 stream() 方法。

    流生成器 我帮不了你。 Spliterator 可以。