当前位置:  开发笔记 > 编程语言 > 正文

.map返回的Java-8 Stream将是并行还是顺序?

如何解决《.map返回的Java-8Stream将是并行还是顺序?》经验,为你挑选了1个好方法。

Stream返回者mapmapToObj方法总是顺序的,还是取决于调用流的状态是否是并行的?

文档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都将是顺序的.



1> Tunaki..:

不,它永远不会改变(除非你自己明确地改变它).

您编写的内容对应于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都将是顺序的.

推荐阅读
LEEstarmmmmm
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有