【发布时间】:2019-09-04 15:47:03
【问题描述】:
如果我在列表(作为源)上使用 forEach() 终端操作(无论其顺序流还是并行流不遵守遇到顺序)的流管道中使用映射操作,则映射尊重遇到顺序在顺序或并行流的情况下的列表?
List<Integer> = Arrays.asList(1,2,3,4,5)
someList.stream().map(i -> i*2).forEach(System.out::println) // this is sequential stream
someList.parallelStream().map(i -> i*2).forEach(System.out::println) // this is parallel stream
如果是,那么在https://stackoverflow.com/a/47337690/5527839这个帖子中,提到地图操作将并行执行。如果保持顺序,使用并行流时如何使性能更好。使用并行流有什么意义?
【问题讨论】:
-
"如果订单保持不变,它将如何使性能更好" - 不会。保持并行流中的顺序可能会降低性能。并行流不是灵丹妙药,它们不会自动改善一切。
-
另外:中间操作本身并不真正“尊重遇到顺序” - 中间操作(不幸的是
.sorted()和.distinct()例外)只关心一个单一元素(hense它是一个“管道”),不需要关心之前或之后会出现什么元素。遇到订单通常只是终端操作的事情。 -
好的...谢谢@M.Prokhorov 为我解惑:)
-
是的,我忘了这两个。它们并不那么明显,但根据经验,如果中间操作隐藏了一些内部状态 - 它会关心遇到顺序。这使得流中的有状态与无状态中间体的比例约为 50/50。
-
@M.Prokhorov 从 Java 9 开始,
takeWhile和dropWhile也将取决于遭遇顺序。
标签: java java-8 java-stream