2

我有一些按预期返回 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;
    }
}
4

1 回答 1

2

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

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

一个警告是生成的流不能有效地拆分(参见链接文档)。这可能会损害并行性能。

笔记:

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

于 2018-07-17T15:36:16.437 回答