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