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时,更具需求,可以考虑使用基本类型.

相关文章
|
存储 C语言 C++
66 C++ - 流的概念和流类库的结构
66 C++ - 流的概念和流类库的结构
86 0
|
3月前
|
负载均衡 安全 Java
并行流的人生
【10月更文挑战第8天】
25 1
|
存储
Stream流中各阶段方法说明及组合示例
Stream流中各阶段方法说明及组合示例
132 1
|
8月前
JDK8之stream流的使用:归约类方法
JDK8之stream流的使用:归约类方法
48 0
|
存储 Java
|
存储 Java
【Java I/O 流】I/O 流的原理与流的分类
所谓 I/O 是 Input/Output 的缩写,即输入/输出。I/O 技术用于处理数据的传输,文件的读写等。 数据传输可以看做是一种数据的流动,而流(Stream)可以理解为数据传输时的序列。按照数据的“流向”,流可分为输入流和输出流。
118 1
|
存储 Java
探索Stream流的实际应用场景
在Java 8中,引入了Stream流这一强大的新特性,它不仅可以让我们更加优雅地处理集合数据,还可以提高代码的简洁性和性能。本文将深入探讨Stream流的实际应用场景,从而帮助读者更好地理解和应用这一功能。
586 0
Kam
Stream流代替双重for循环小记
Stream流代替双重for循环
Kam
996 0
|
存储
Stream流终结操作方法、收集操作及Stream综合练习
Stream流终结操作方法、收集操作及Stream综合练习
138 0