根据统计的时间段进行分组,例如当天的时间段0点到6点、6点到12点,12点到18点的统计数量,这时候繁杂的for循环会导致代码量激增,切不够明了。我们可以用Java8的链式方式来进行分组
hour:带表要隔的时间
时间最好用LocalDateTime
根据小时
LocalTime.MAX//获取当前时间的结束
LocalTime.MIN//获取当前时间的开始
map = list.stream().collect(Collectors.groupingBy(o-> o.getAlarmTime().getHour()/hour));
根据分钟
map = list.stream().collect(Collectors.groupingBy(o-> o.getAlarmTime().getMinute()()/10));
按周统计
LocalDate date = ...; // WeekFields.ISO = 一星期从周一开始算, 其它的请自己摸索. WeekFields weekFields = WeekFields.ISO; int weekNumber = date.get(weekFields.weekOfWeekBasedYear()); map = list.stream().collect(Collectors.groupingBy(o-> o.getAlarmTime().get(weekFields.weekOfMonth()) )); 或者 map = list.stream().collect(Collectors.groupingBy(o-> o.getAlarmTime().get(weekFields.weekOfWeekBasedYear()) ));
除了weekOfWeekBasedYear,还有一个weekOfYear,它们两个的具体区别为:
如果一周涉及到了跨年,如2021.12.31是周五,2022.01.01是周六,这涉及到了年份的变化。
weekOfWeekBasedYear会把2021.12.31、2022.01.01(新年第一天)看做是2021年的最后一周,即看做同一周;
weekOfYear则会把2021.12.31看做是2021年的最后一周,把2022.01.01看最是2022年的第一周,即当做两周。