并行流
大约 1 分钟函数式编程高级用法
当流中有大量元素时,我们可以使用并行流去提高操作的效率。其实并行流就是把任务分配给多个线程去完全。如果我们自己去用代码实现的话其实会非常的复杂,并且要求你对并发编程有足够的理解和认识。而如果我们使用stream的话,我们只需要修改一个方法的调用就可以使用并行流来帮我们实现,从而提高效率。
public static void main(String[] args) throws Throwable {
Stream<Integer> stream = Stream.of(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
Integer res = stream
.peek(num -> {
System.out.println(num + "===>"+Thread.currentThread().getName());
})
.filter(num -> num > 5)
.reduce((r, e) -> r + e)
.get();
System.out.println(res);
}
只有一个线程在计算:
1===>main
2===>main
3===>main
4===>main
5===>main
6===>main
7===>main
8===>main
9===>main
10===>main
40
Process finished with exit code 0
使用并行流:
public static void main(String[] args) throws Throwable {
Stream<Integer> stream = Stream.of(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
Integer res = stream.parallel() // 并行流
.peek(num -> {
System.out.println(num + "===>"+Thread.currentThread().getName());
})
.filter(num -> num > 5)
.reduce((r, e) -> r + e)
.get();
System.out.println(res);
}
会发现有多个线程在工作:
3===>ForkJoinPool.commonPool-worker-1
10===>ForkJoinPool.commonPool-worker-7
1===>ForkJoinPool.commonPool-worker-6
5===>ForkJoinPool.commonPool-worker-5
7===>main
9===>ForkJoinPool.commonPool-worker-2
8===>ForkJoinPool.commonPool-worker-4
2===>ForkJoinPool.commonPool-worker-3
6===>ForkJoinPool.commonPool-worker-7
4===>ForkJoinPool.commonPool-worker-1
40
Process finished with exit code 0
并行流的转化
- 像上面那样,流调用**parallel()**方法。
- 集合或者数组直接调用parallelStream转化成并行流。