如何交错(合并)两个Java 8流?

布伦德尔:
 Stream<String> a = Stream.of("one", "three", "five");
 Stream<String> b = Stream.of("two", "four", "six");

我需要做什么做的输出是下面?

// one
// two
// three
// four
// five
// six

我看着concat,但作为javadoc的解释,它只是追加一前一后,它没有交错/点缀。

Stream<String> out = Stream.concat(a, b);
out.forEach(System.out::println);

创建懒惰地级联流的元素是所有第一流接着是第二数据流中的所有元素的元素。

错误地给

 // one
 // three
 // five
 // two
 // four
 // six

能做到这一点,如果我收集了他们和迭代,但希望更多的东西Java8-Y,流j :-)

注意

我不想压缩的流

“压缩”操作会从每个集合的元素,将它们结合起来。

拉链操作的结果会是这样的:(不必要的)

 // onetwo
 // threefour
 // fivesix
霍尔格:

我会使用这样的:

public static <T> Stream<T> interleave(Stream<? extends T> a, Stream<? extends T> b) {
    Spliterator<? extends T> spA = a.spliterator(), spB = b.spliterator();
    long s = spA.estimateSize() + spB.estimateSize();
    if(s < 0) s = Long.MAX_VALUE;
    int ch = spA.characteristics() & spB.characteristics()
           & (Spliterator.NONNULL|Spliterator.SIZED);
    ch |= Spliterator.ORDERED;

    return StreamSupport.stream(new Spliterators.AbstractSpliterator<T>(s, ch) {
        Spliterator<? extends T> sp1 = spA, sp2 = spB;

        @Override
        public boolean tryAdvance(Consumer<? super T> action) {
            Spliterator<? extends T> sp = sp1;
            if(sp.tryAdvance(action)) {
                sp1 = sp2;
                sp2 = sp;
                return true;
            }
            return sp2.tryAdvance(action);
        }
    }, false);
}

它保留了输入的特性尽可能流,它允许某些优化(例如,用于count()toArray())。此外,增加了ORDERED即使在输入流可能是无序的,以反映交织。

当一个数据流具有比其他多个元件,其余的元素将出现在端。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章