Bootstrap

Java的并行流parallelStream之结果被收集后排序分析

一、先说结论

parallelStream在中间处理时都是并行的(这里不展开说明并行的实现),所以parallelStream中间处理的结果都是乱序的,但是在使用了Collect收集器后,parallelStream被收集的结果默认都是按照集合的原序列进行排序的。

二、实例测试

2.1、先上代码
/**
     * collect 收集时可以排序成原数组数据
     */
    @Test
    public void myParallelTest() {

        List<Integer> testList = Lists.newArrayList(1, 91, null, 8, 100, 78, 9, 68);

        testList.parallelStream()
                .map(m -> {
                    if (Objects.isNull(m)) {
                        return null;
                    }
                    return m + 1;
                })
                .forEach(f -> System.out.print(f + " "));
       
        System.out.println();
        System.out.println("-----------------");

        List<Integer> collect = testList.parallelStream()
                .map(m -> {
                    if (Objects.isNull(m)) {
                        return null;
                    }
                    return m + 1;
                })
                .collect(Collectors.toList());

        collect.forEach(f -> System.out.print(f + " "));
    }
2.2、运行结果

在这里插入图片描述

2.3、说明

测试代码上定义一个Integer类型集合:
第一次使用parallelStream进行对集合遍历输出时发现中间处理的结果都是乱序的。
第二次使用parallelStream进行对集合经过map处理后,再通过collect进行收集,发现collect收集的结果的顺序和原集合的顺序是一样的。
这个测试结果可以证明开头结论的正确性。

三、parallelStream结果差异分析

问题其实很明朗,主导因素在collect收集器上。

todo collect源码分析
;