使用 lambda 或 Stream API 合并流以生成交替序列
merge streams to produce alternating sequence using lambda or Stream API
我有一些代码 returns 一个流,但也许它可以用某种类型的 lambda 或 stream() 操作代替,而不是在 while
循环中耗尽迭代器?
它只是一种交替流 first
和 second
中的元素并在其中一个元素用完时停止的方法。
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。
我有一些代码 returns 一个流,但也许它可以用某种类型的 lambda 或 stream() 操作代替,而不是在 while
循环中耗尽迭代器?
它只是一种交替流 first
和 second
中的元素并在其中一个元素用完时停止的方法。
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。