J2EE 世界的磨练 第一期

本文通过实际案例探讨了Java8中Stream API的使用技巧与常见误区,特别是在group by和聚合操作方面,并分享了一种高效处理JSON数据的策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

初心: 每天记录一个工作上的问题, 以便在日后温故知新,看到自己进步的同时, 也收集过去的积累

1.用java8新的API时犯了个典型的错误, list一顿修改后,要赋值给新的变量. 同理, list里元素更改,也要重新set进去

==>每次接触性的API时,看下method签名. 摒弃坏习惯,拿来就用,不顾一切

//case1
resultList.stream().collect(
                    Collectors.groupingBy(TopLocationByMeetings::getLocation, Collectors.summingInt(TopLocationByMeetings::getMeetings)));

//case2
for (int i = 0; i < list.size() ; i++) {
                TopParticipantsByMeeting user = list.get(i);
                user.setUsername(emailToUsername.get(user.getEmail()));
                list.set(i,user);
            }

2. 工作上碰到这样一个业务场景, 从DB里拉数据,"[{},{},{}]",进行groupby操作,取top10.

本来常规思路是让数据直接平铺存到DB里,而不是存成json格式. 但基于这个是实时数据,减少前面数据更新的IO.

就有了这样的业务场景.

我的做法:

DB->list->groupby->map->list->sort->limit(10)->json response

看到但未尝试的做法: 由于暂未看两个sort的源码,暂时无法得出哪个更加高效

DB->list->groupby->map->sort->linkedhashmap->limit(10)->list->json response

case1: entity(email,minutes)

 

case2: entity(email,username,minutes)

由于map的kv 2元 limitation, 刚开始用了getEmailAndUsername的方法, 用"___", 最后split,但后来觉得这个有点不稳定(比如出现"___","a___","___b" 或者username里包含了"___". 不定因素太多.后来用了hashmap来做映射,反正时间复杂度为O(1).

组建 email->username的map,在最后list里赋值

case3: entity(email, minutes,meetings)

java8 stream collectors 提供了groupby操作, 但只看到一个字段的agg操作,而非sql那样的sum(minutes),sum(meetings) group by email

最后选择分两次单独group by,赋值给map1,map2, 后面在loop map1时 根据key,来set map2的值

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值