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