使用 lambda 或 Stream API 合并流以生成交替序列

merge streams to produce alternating sequence using lambda or Stream API

我有一些代码 returns 一个流,但也许它可以用某种类型的 lambda 或 stream() 操作代替,而不是在 while 循环中耗尽迭代器?

它只是一种交替流 firstsecond 中的元素并在其中一个元素用完时停止的方法。

public static <T>Stream<T> alternatingSequence(Stream<T> first, Stream<T> second){
        Iterator<T> iteratorFirst = first.iterator();
        Iterator<T> iteratorSecond = second.iterator();
        Stream<T> resultStream = Stream.empty();
        while (iteratorFirst.hasNext() && iteratorSecond.hasNext()){
            resultStream = Stream.concat(resultStream, Stream.of(iteratorFirst.next(), iteratorSecond.next()));
        }
        return resultStream;
    }
}

使用 Guava's Streams.zip 您可以将两个流组合成一个双元素流,然后您可以简单地展平以产生交替序列:

return Streams.zip(first, second, (arg1, arg2) -> Stream.of(arg1, arg2))
    .flatMap(Function.identity());

需要注意的是,生成的流无法有效拆分(请参阅链接文档)。这可能会损害并行性能。

注:

如果您无法访问 Guava,那么您可以实现自己的 zip(a, b, bifunc),如图 here