Flatmap()方法是否保留流的顺序?

12
我需要将多个整数数组连接起来,并在此过程中保留元素的顺序。
例如:
 final Integer[] arr1= { 1, 3, 2 };
 final Integer[] arr2= { 4, 6, 5 };
 final Integer[] arr3= { 7, 9, 8, 10 };
 final Integer[] arr4= { 11, 13, 12, 15, 14 };

因此,当我尝试使用Java 8流将这4个数组合并为一个数组时;

Stream.of(arr1, arr2, arr3, arr4).flatMap(Stream::of).toArray(Integer[]::new); 

这完美地呈现了结果;

[1, 3, 2, 4, 6, 5, 7, 9, 8, 10, 11, 13, 12, 15, 14]

然而,我阅读了一些文章和评论,人们声称flatMap方法并不总是保留原始流的顺序。这是正确的吗?除此之外,我还能做些什么来保持原始顺序呢?


3
如果顺序很重要,为什么不使用 concatMap - vahdet
你能提供一些这些文章或评论的链接吗?Java文档中说:“如果流是有序的,则在相同源上执行相同的流管道的重复执行将产生相同的结果;如果它不是有序的,则重复执行可能会产生不同的结果。”。 - Lukas Körfer
1
关于代码片段的一点提示:在这个例子中是否有final并不重要,因此如果您将其删除,读者阅读这个问题时需要付出更少的努力。而且,您可能也不需要四个数组来说明您的问题。我建议保持示例尽可能简洁(即使这个示例已经相当简洁了,所以很好)。 - Christian Neverdal
1
通常情况下,除非文档中指定了unordered操作,否则它是有序的。 - Eugene
1
在我的情况下,flatMap 没有保留顺序,所以我使用了 concatMap。@vahdet 感谢你的评论。 - malhobayyeb
1个回答

15

flatmap()方法是否会保留流的顺序?

是的,flatmap()方法和map()方法都会保留顺序。

然而,我读了一些文章和评论,有人声称flatmap方法并不总是保留原始流的顺序。这是正确的吗?

没有任何实际的例子,很难争辩这个问题。


来源:zeroturnaround.com

进入图像描述


1
那个链接不是方法文档,它是正确的,但不是官方的。 - Eugene

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接