我一直很好奇Collections.parallelStream()
和Collections.stream().parallel()
之间的区别。根据Javadocs,parallelStream()
尝试返回并行流,而stream().parallel()
返回并行流。通过对我自己的一些测试,我发现没有差异。这两种方法的区别在哪里?一个实现比另一个更有效吗?感谢。
答案 0 :(得分:13)
即使他们现在的行为与相同,也会有所不同 - 至少在他们正确指出的文档中;据我所知,未来可能会被利用。
目前parallelStream
方法在Collection
接口中定义为:
default Stream<E> parallelStream() {
return StreamSupport.stream(spliterator(), true);
}
作为一个默认方法,它可以在实现中被覆盖(这就是Collections
内部类实际上做的事情。)
这暗示即使默认方法返回并行Stream,也可能有覆盖此方法的集合返回non-parallel Stream
。这就是文档可能就是这样的原因。
同时甚至如果parallelStream
返回顺序流 - 它仍然是Stream
;然后你可以轻松地打电话给parallel
:
Collections.some()
.parallelStream() // actually sequential
.parallel() // force it to be parallel
至少对我来说这看起来很奇怪。
似乎文档应该以某种方式说明在调用parallelStream
之后应该没有理由再次调用parallel
来强迫它 - 因为它可能对处理无用甚至不好。
修改强>
对于阅读本文的任何人 - 请阅读Holger的评论;它涵盖的范围超出了我在这个答案中的说法。
答案 1 :(得分:6)
Collections.parallelStream()
和Collections.stream().parallel()
之间没有区别。它们都会将流划分为底层分裂器允许的范围,并且它们都将使用默认的ForkJoinPool运行(除非已在另一个内部运行)。
答案 2 :(得分:3)
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。
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
我不确定,但是正如 stream().parallel()
在O / P时间中提到的那样,它是 parallelStream()
的1/6。 >
仍然欢迎任何专家的建议。