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

时间:2018-07-16 13:58:11

标签: java java-8 java-stream sequence alternating

我有一些代码可以按预期返回Stream,但是也许可以用某种类型的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;
    }
}

1 个答案:

答案 0 :(得分:1)

使用Guava's Streams.zip,您可以将两个流合并为一个包含两个元素的流,然后可以将它们简单地展平以产生一个交替的序列:

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

一个警告是,生成的流无法有效拆分(请参阅链接的文档)。这可能会损害并行性能。

注意:

如果您无权访问番石榴,则可以实现自己的zip(a, b, bifunc),如图here所示。