Stream<String> a = Stream.of("one", "three", "five");
Stream<String> b = Stream.of("two", "four", "six");
我需要做些什么才能使输出如下所示?
// one
// two
// three
// four
// five
// six
我研究了concat
,但正如javadoc所解释的,它只是一个接一个地附加,而不是交叉/穿插。
Stream<String> out = Stream.concat(a, b);
out.forEach(System.out::println);
创建一个惰性串联流,其元素是第一流的所有元素,后跟第二流的所有元素。
错误地给予
// one
// three
// five
// two
// four
// six
如果我收集它们并迭代,我可以做到这一点,但希望有更多的Java8-Y,流:-)
注
我不想压缩数据流
“zip”操作将从每个集合中取出一个元素并将它们组合起来。
压缩操作的结果将类似于以下内容:(不需要)
// onetwo
// threefour
// fivesix
7条答案
按热度按时间dgjrabp21#
我会这样说:
它尽可能地保留输入流的特性,这允许某些优化(例如对于
count()
和toArray()
)。此外,即使当输入流可能是无序的时,它也添加ORDERED
以反映交织。当一个流比另一个流具有更多的元素时,剩余的元素将出现在末尾。
kd3sttzy2#
一个比Holger更愚蠢的解决方案,但可能会符合您的要求:
i7uaboj43#
正如您可以从问题注解中看到的,我使用zip进行了尝试:
zed5wv104#
这可能不是个好答案
(1)它收集到Map上,我猜你不想这么做
(2)它不是完全无状态的,因为它使用AtomicIntegers。
还在加是因为
(1)它是可读且
(2)社区可以从中得到一些想法并尝试改进它。
产出
@霍尔格编辑
pgvzfuti5#
没有任何外部库(使用jdk11)
listStream是一个
Stream<List<A>>
,它的返回是平坦的。结果是:
[1, 4, 2, 5, 3, 6, 7, 8, 9]
tmb3ates6#
Iterator
的一个解决方案或者简单地通过我提供的abacus-common中的解决方案:
kmb7vmvb7#
Using Guava's Streams.zip and
Stream.flatMap
:图纸: