Java 12 新特性—新增 Collectors API

作者简介:大家好,我是smart哥,前中兴通讯、美团架构师,现某互联网公司CTO

联系qq:184480602,加我进群,大家一起学习,一起进步,一起对抗互联网寒冬

学习必须往深处挖,挖的越深,基础越扎实!

阶段1、深入多线程

阶段2、深入多线程设计模式

阶段3、深入juc源码解析


阶段4、深入jdk其余源码解析


阶段5、深入jvm源码解析

码哥源码部分

码哥讲源码-原理源码篇【2024年最新大厂关于线程池使用的场景题】

码哥讲源码【炸雷啦!炸雷啦!黄光头他终于跑路啦!】

码哥讲源码-【jvm课程前置知识及c/c++调试环境搭建】

​​​​​​码哥讲源码-原理源码篇【揭秘join方法的唤醒本质上决定于jvm的底层析构函数】

码哥源码-原理源码篇【Doug Lea为什么要将成员变量赋值给局部变量后再操作?】

码哥讲源码【你水不是你的错,但是你胡说八道就是你不对了!】

码哥讲源码【谁再说Spring不支持多线程事务,你给我抽他!】

终结B站没人能讲清楚红黑树的历史,不服等你来踢馆!

打脸系列【020-3小时讲解MESI协议和volatile之间的关系,那些将x86下的验证结果当作最终结果的水货们请闭嘴】

Java 12 引入 Collectors.teeing(),进一步增强了 Java 的流(Stream)处理能力。

teeing() 允许对同时对一个流进行两种不同的收集操作,并将这两种操作的结果合并成一个。方法定义如下:

Collectors.teeing(Collector<? super T,A,R1> downstream1, Collector<? super T,A,R2> downstream2, BiFunction<? super R1,? super R2,R> merger)
  • downstream1 和 downstream2:两个不同的 Collector 实例。
  • merger:一个 BiFunction,用于合并两个 Collector 的结果。

teeing() 非常适合于那些需要对同一个数据集进行多重处理的情景。

teeing() 非常适合于那些需要对同一个数据集进行多重处理的情景。例如,你可以同时计算一个数字列表的平均值和总和,或者找出一个员工列表中工资最高和最低的员工。

比如有一个整数列,我们需要计算出这个列的最大值和平均值。

  • 以前写法
    @Test
    public void teeingTest() throws IOException {
        List<Integer> list = Arrays.asList(9,5,13,22,34,16,18,23,55);
        // 计算最大值
        Integer max = list.stream()
                .max(Integer::compareTo).get();

        // 计算平均值
        Double ave = list.stream()
                .collect(Collectors.averagingInt(Integer::intValue));

        System.out.println(list + ",最大值:" + max + ",;平均值:" + ave);
    }

平均值和最大值要分别使用两个不同的 Stream 来计算,要算两遍。如果使用 teeing() 呢?

  • 使用 teeing()
    @Test
    public void teeingTest() throws IOException {
        List<Integer> list = Arrays.asList(9,5,13,22,34,16,18,23,55);

        Map<String,Object> resultMap = list.stream()
                .collect(Collectors.teeing(
                        Collectors.maxBy(Integer::compareTo),
                        Collectors.averagingInt(Integer::intValue),
                        (v1,v2) ->{
                            return Map.of("max",v1,"ave",v2);
                        }
                ));
        System.out.println(list + ",最大值:" + resultMap.get("max").toString() + ",;平均值:" + resultMap.get("ave").toString());
    }

利用 maxBy() 和 averagingInt() 分别求出最大值和平均值,然后利用那个 teeing(),将他们两个合并到 Map 中。

这种方式比上面求两次的方式更加简洁了,但是它也可能会带来一些性能开销,尤其是在处理大数据集时。所以在使用该方法的时候需要评估数据量,对性能进行测试,确保它满足应用的性能要求。

  • 4
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值