需求是这样的,给了一个日期时间区间,一个对象list ;要统计这个时间段内每天某个小时段的数据量之和:如图
刚开始思路是把时间区间按每个小时进行拆分,得到这段时间每个小时的开始结束时间跟list对象进行比对后在进行整合计算,发现代码会很臃肿,用stream流就能完美优雅的解决这个问题。如下:
1,查出这个时间截点的所有数据
2,将list所有数据按小时进行分组;(精华所在)
list.stream().collect(Collectors.groupingBy(item -> new SimpleDateFormat("yyyy-MM-dd HH").format(item.getCreateTime())));
3,用正则匹配每个小时的对应的集合
for (int i = 23; i >=0 ; i--) {
Map xdMap = new HashMap();
Map<String, List<EduRsrcVisitor>> visMap = list.stream().collect(Collectors.groupingBy(item -> new SimpleDateFormat("yyyy-MM-dd HH").format(item.getCreateTime())));
List<EduRsrcVisitor> eduRsrcVisitors = new ArrayList<>();
for (String s : visMap.keySet()) {
if(Integer.parseInt(s.substring(s.length() - 1, s.length()))==i){
eduRsrcVisitors.addAll(visMap.get(s));
}
}
}