[英]Java-8 Stream returned by .map will be parallel or sequential?
map
或mapToObj
方法返回的Stream
总是顺序的,还是取决于调用流的状态是否是并行的?
IntStream
的文档没有明确地回答这个问题,或者我无法正确理解它:
我想知道来自以下示例的流是否会并行到最后,或者它会在某个时刻发生变化。
IntStream.range(1, array_of_X.size())
.parallel()
.mapToObj (index -> array_of_X.get(index)) // mapping#1
.filter (filter_X)
.map (X_to_Y) //mapping#2
.filter (filter_Y)
.mapToInt (obj_Y_to_int) //mapping#3
.collect(value -> Collectors.summingInt(value));
不,它永远不会改变(除非你自己明确地改变它)。
您编写的内容对应于Stream管道,单个管道具有单一方向:并行或顺序。 因此,没有“并行到最后”,因为整个流水线将并行执行或者将按顺序执行。
引用Stream包 Javadoc:
此示例的串行和并行版本之间的唯一区别是使用“
parallelStream()
”而不是“stream()
”创建初始流。 当启动终端操作时,根据调用它的流的方向,顺序地或并行地执行流管道。 可以使用isParallel()
方法确定流是以串行还是并行方式执行,并且可以使用BaseStream.sequential()
和BaseStream.parallel()
操作修改流的方向。 当启动终端操作时,根据调用它的流的模式,顺序地或并行地执行流管道。
这意味着Stream管道改变其方向的唯一方法是调用sequential()
或parallel()
方法之一。 由于这是Stream API的全局,因此不是为每个操作编写,而是在Javadoc包中编写。
使用您的问题中的代码,Stream管道将并行执行,因为您通过调用parallel()
明确地更改了Stream方向。
值得注意的是,Stream的最终调整将是对parallel()
或sequential()
的最后调用。 请考虑以下三个示例:
public static void main(String[] args) {
System.out.println(IntStream.range(0, 10).isParallel());
System.out.println(IntStream.range(0, 10).parallel().isParallel());
System.out.println(IntStream.range(0, 10).parallel().map(i -> 2*i).sequential().isParallel());
}
false
因为IntStream.range
返回一个顺序Stream true
因为我们调用了parallel()
false
因为即使我们在管道中调用parallel()
,我们之后调用sequential()
,因此它将Stream管道的总方向重置为serial。 请注意,仍然引用:
除非明确请求并行性,否则JDK中的流实现会创建串行流。
因此,除非您明确要求并行流,否则您要检索的每个Stream都将是顺序的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.