我有一些代码可以按预期返回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;
    }
}

最佳答案

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

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


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

注意:

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

09-04 20:08