并行流

HeJin大约 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转化成并行流。