首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >parallelStream vs stream.parallel

parallelStream vs stream.parallel
EN

Stack Overflow用户
提问于 2017-05-06 01:59:21
回答 3查看 20K关注 0票数 40

我一直对Collections.parallelStream()Collections.stream().parallel()之间的区别感到好奇。根据Javadoc的说法,parallelStream()尝试返回并行流,而stream().parallel()返回并行流。通过我自己的一些测试,我没有发现任何差异。这两种方法的不同之处在哪里?一种实现比另一种实现更有时间效率吗?谢谢。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-05-06 15:42:23

即使他们现在的行为是一样的,也是有区别的-至少在他们的文档中,正如你正确地指出的那样;据我所知,这可能会在未来被利用。

目前,Collection接口中的parallelStream方法定义为:

代码语言:javascript
复制
default Stream<E> parallelStream() {
    return StreamSupport.stream(spliterator(), true);
}

作为一种默认方法,它可以在实现中被覆盖(这正是Collections内部类实际做的事情)。

这暗示即使默认方法返回并行流,也可能存在覆盖此方法以返回non-parallel Stream的集合。这就是文档可能是这样的原因。

同时,即使parallelStream返回一个连续的流-它仍然是一个Stream,然后你可以很容易地对它调用parallel

代码语言:javascript
复制
  Collections.some()
       .parallelStream() // actually sequential
       .parallel() // force it to be parallel

至少对我来说,这看起来很奇怪。

文档似乎应该以某种方式声明,在调用parallelStream之后,应该没有理由再次调用parallel来强制这样做-因为它可能无用,甚至不利于处理。

编辑

对于任何阅读本文的人-请同时阅读Holger的评论;它涵盖了我在这个答案中所说的以外的情况。

票数 30
EN

Stack Overflow用户

发布于 2017-05-06 06:21:55

Collections.parallelStream()Collections.stream().parallel()之间没有区别。它们都会将流划分到底层拆分器允许的范围内,并且都会使用默认的ForkJoinPool运行(除非已经在另一个内部运行)。

票数 9
EN

Stack Overflow用户

发布于 2020-05-14 15:51:27

代码语言:javascript
复制
class Employee {
    String name;
    int salary;

    public int getSalary() {
        return salary;
    }

    public void setSalary(int salary) {
        this.salary = salary;
    }

    public Employee(String name, int salary) {
        this.name = name;
        this.salary = salary;
    }
}
class ParallelStream {

    public static void main(String[] args) {

        long t1, t2;
        List<Employee> eList = new ArrayList<>();
        for (int i = 0; i < 100; i++) {
            eList.add(new Employee("A", 20000));
            eList.add(new Employee("B", 3000));
            eList.add(new Employee("C", 15002));
            eList.add(new Employee("D", 7856));
            eList.add(new Employee("E", 200));
            eList.add(new Employee("F", 50000));
        }

        /***** Here We Are Creating A 'Sequential Stream' & Displaying The Result *****/
        t1 = System.currentTimeMillis();
        System.out.println("Sequential Stream Count?= " + eList.stream().filter(e -> e.getSalary() > 15000).count());

        t2 = System.currentTimeMillis();
        System.out.println("Sequential Stream Time Taken?= " + (t2 - t1) + "\n");

        /***** Here We Are Creating A 'Parallel Stream' & Displaying The Result *****/
        t1 = System.currentTimeMillis();
        System.out.println("Parallel Stream Count?= " + eList.parallelStream().filter(e -> e.getSalary() > 15000).count());

        t2 = System.currentTimeMillis();
        System.out.println("Parallel Stream Time Taken?= " + (t2 - t1));

        /***** Here We Are Creating A 'Parallel Stream with Collection.stream.parallel' & Displaying The Result *****/
        t1 = System.currentTimeMillis();
        System.out.println("stream().parallel() Count?= " + eList.stream().parallel().filter(e -> e.getSalary() > 15000).count());

        t2 = System.currentTimeMillis();
        System.out.println("stream().parallel() Time Taken?= " + (t2 - t1));



    }

}

我尝试了所有三种方法的.stream(),.parallelStream() and .stream().parallel().,具有相同数量的记录,并且能够识别所有三种方法所采用的时间。

这里我已经提到了同样的O/P。

代码语言:javascript
复制
Sequential Stream Count?= 300
Sequential Stream Time Taken?= 18
Parallel Stream Count?= 300
Parallel Stream Time Taken?= 6
stream().parallel() Count?= 300
stream().parallel() Time Taken?= 1

我不确定,但正如O/P中提到的,stream().parallel()占用的时间是parallelStream().的1/6

不过,任何专家的建议都是最受欢迎的。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43811182

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档