Stream优化(使用并行流和数据使用基本类型)

简介: Stream优化(使用并行流和数据使用基本类型)

一 根据数据量,合理使用并行流

并行有线程上下文切换的损耗,如果集合内容不大,使用串行更佳.

1.使用parallel()

    private static void test01() {
        Stream<Integer> integerStream = Stream.of(1, 2, 3, 4, 5, 6, 7, 8, 9, 0); //创建一个普通流
        System.out.println(integerStream.isParallel()); //打印流是否是并行流
 
        Optional<Integer> sumOptional = integerStream.parallel()        //将串行流设置为并行流
                .peek((num) -> {
                    System.out.println(num + ":" + Thread.currentThread().getName()); //打印数字和线程名字,验证是否是多线程
                })
                .filter(num -> num > 6) //过滤,保留大于6的元素
                .reduce((n1, n2) -> n1 + n2); //求和
        sumOptional.ifPresent(System.out::println); //如果结果存在,打印
    }
false
7:main
8:ForkJoinPool.commonPool-worker-4
3:ForkJoinPool.commonPool-worker-9
6:main
0:ForkJoinPool.commonPool-worker-13
2:ForkJoinPool.commonPool-worker-11
1:ForkJoinPool.commonPool-worker-6
4:ForkJoinPool.commonPool-worker-9
5:ForkJoinPool.commonPool-worker-4
9:ForkJoinPool.commonPool-worker-2
24

2.使用parallelStream()

    private static void test02() {
        Integer[] arr={1, 2, 3, 4, 5, 6, 7, 8, 9, 0};
        List<Integer> integers = Arrays.asList(arr);
        Optional<Integer> sumOptional =integers.parallelStream() //创建并行流
                .peek((num) -> {
                    System.out.println(num + ":" + Thread.currentThread().getName()); //打印数字和线程名字,验证是否是多线程
                })
                .filter(num -> num > 6) //过滤,保留大于6的元素
                .reduce((n1, n2) -> n1 + n2); //求和
        sumOptional.ifPresent(System.out::println); //如果结果存在,打印
    }
7:main
3:ForkJoinPool.commonPool-worker-9
0:ForkJoinPool.commonPool-worker-13
1:ForkJoinPool.commonPool-worker-6
4:ForkJoinPool.commonPool-worker-13
9:ForkJoinPool.commonPool-worker-2
6:main
8:ForkJoinPool.commonPool-worker-4
2:ForkJoinPool.commonPool-worker-11
5:ForkJoinPool.commonPool-worker-9
24

二 基本类型的优化

 private static void test03() {
        Stream<Integer> integerStream = Stream.of(1, 2, 3, 4, 5, 6, 7, 8, 9, 0); //创建一个普通流
        System.out.println(integerStream.isParallel()); //打印流是否是并行流
 
        OptionalInt reduce = integerStream.parallel()        //将串行流设置为并行流
                .peek((num) -> {
                    System.out.println(num + ":" + Thread.currentThread().getName()); //打印数字和线程名字,验证是否是多线程
                })
                .mapToInt(new ToIntFunction<Integer>() {
                    @Override
                    public int applyAsInt(Integer value) {
                        return value;
                    }
                })
                .filter(num -> num > 6) //过滤,保留大于6的元素
                .reduce((n1, n2) -> n1 + n2);//求和
        int asInt = reduce.getAsInt();
        System.out.println(asInt);
    }


 集合元素为Integer类型,过滤计算使用int基本类型,如果数据量比较大,会涉大量自动拆箱装箱.我们可以直接使用mapToInt装换为基本类型进行操作,减少拆装箱.

使用map和flatMap时,更具需求,可以考虑使用基本类型.

相关文章
|
1月前
|
负载均衡 安全 Java
并行流的人生
【10月更文挑战第8天】
17 1
|
5月前
|
Java
Java并行流问题之parallelStream的使用方式
Java并行流问题之parallelStream的使用方式
104 1
|
5月前
|
存储 Java API
Java——Stream流(1/2):Stream流入门、Stream流的创建(认识Stream、体验Stream流、Stream流的使用步骤、获取Stream流的方法)
Java——Stream流(1/2):Stream流入门、Stream流的创建(认识Stream、体验Stream流、Stream流的使用步骤、获取Stream流的方法)
82 0
|
Linux
44 # 流的原理
44 # 流的原理
62 0
|
存储 Java
【Java I/O 流】I/O 流的原理与流的分类
所谓 I/O 是 Input/Output 的缩写,即输入/输出。I/O 技术用于处理数据的传输,文件的读写等。 数据传输可以看做是一种数据的流动,而流(Stream)可以理解为数据传输时的序列。按照数据的“流向”,流可分为输入流和输出流。
105 1
|
存储 Java
探索Stream流的实际应用场景
在Java 8中,引入了Stream流这一强大的新特性,它不仅可以让我们更加优雅地处理集合数据,还可以提高代码的简洁性和性能。本文将深入探讨Stream流的实际应用场景,从而帮助读者更好地理解和应用这一功能。
562 0
|
存储
Stream流终结操作方法、收集操作及Stream综合练习
Stream流终结操作方法、收集操作及Stream综合练习
129 0
|
存储 分布式计算 Java
Java 8 - Stream基本实例及Stream的并行处理在线程上的表现
Java 8 - Stream基本实例及Stream的并行处理在线程上的表现
246 0
|
缓存 前端开发 Java
JAVA中并行流的使用场景
JAVA中并行流的使用场景
238 0
|
SQL Java 程序员
Stream流的操作
Stream流的操作
68 0