Stream
返回者map
或mapToObj
方法总是顺序的,还是取决于调用流的状态是否是并行的?
文档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));
Tunaki.. 6
不,它永远不会改变(除非你自己明确地改变它).
您编写的内容对应于Stream管道,单个管道具有单一方向:并行或顺序.因此,没有"并行到最后",因为整个流水线将并行执行或者将按顺序执行.
引用Stream包 Javadoc:
此示例的串行和并行版本之间的唯一区别是创建初始流,使用"
parallelStream()
"而不是"stream()
".当启动终端操作时,根据调用它的流的方向,顺序地或并行地执行流管道.可以使用该isParallel()
方法确定流是以串行还是并行方式执行,并且可以使用BaseStream.sequential()
和BaseStream.parallel()
操作来修改流的方向.当启动终端操作时,根据调用它的流的模式,顺序地或并行地执行流管道.
这意味着Stream管道改变其方向的唯一方法是调用其中一个sequential()
或parallel()
方法.由于这是Stream API的全局,因此不是为每个操作编写,而是在Javadoc包中编写.
使用您的问题中的代码,Stream管道将并行执行,因为您通过调用明确地更改了Stream方向parallel()
.
重要的是要注意,由此产生的流量的最终调用将是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
返回顺序流
第二个将true
在我们调用后打印parallel()
第三个将打印,false
因为即使我们调用parallel()
管道,我们sequential()
之后调用它,因此它将Stream管道的总方向重置为serial.
请注意,仍然引用:
除非明确请求并行性,否则JDK中的流实现会创建串行流.
因此,除非您明确要求并行流,否则您要检索的每个Stream都将是顺序的.
不,它永远不会改变(除非你自己明确地改变它).
您编写的内容对应于Stream管道,单个管道具有单一方向:并行或顺序.因此,没有"并行到最后",因为整个流水线将并行执行或者将按顺序执行.
引用Stream包 Javadoc:
此示例的串行和并行版本之间的唯一区别是创建初始流,使用"
parallelStream()
"而不是"stream()
".当启动终端操作时,根据调用它的流的方向,顺序地或并行地执行流管道.可以使用该isParallel()
方法确定流是以串行还是并行方式执行,并且可以使用BaseStream.sequential()
和BaseStream.parallel()
操作来修改流的方向.当启动终端操作时,根据调用它的流的模式,顺序地或并行地执行流管道.
这意味着Stream管道改变其方向的唯一方法是调用其中一个sequential()
或parallel()
方法.由于这是Stream API的全局,因此不是为每个操作编写,而是在Javadoc包中编写.
使用您的问题中的代码,Stream管道将并行执行,因为您通过调用明确地更改了Stream方向parallel()
.
重要的是要注意,由此产生的流量的最终调用将是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
返回顺序流
第二个将true
在我们调用后打印parallel()
第三个将打印,false
因为即使我们调用parallel()
管道,我们sequential()
之后调用它,因此它将Stream管道的总方向重置为serial.
请注意,仍然引用:
除非明确请求并行性,否则JDK中的流实现会创建串行流.
因此,除非您明确要求并行流,否则您要检索的每个Stream都将是顺序的.