我有一个以此方式制成的对象清单:
public class Object{
private Date date;
private double value;
//getters and setters
}
我只需要每小时采集一次物体。
我的想法是通过这种方式使用Java8流和groupingBy函数
Map<Integer, List<Object>> map = objects()
.collect(Collectors.groupingBy(x -> x.getDate().get(ChronoField.HOUR_OF_DAY)));
但是以这种方式,即使我的清单中有多天,我也只需要24个元素(一天每小时一小时)。如何按天/小时分组?
答案 0 :(得分:3)
我强烈建议您在此处使用LocalDateTime
而不是Date
。
基本上,您不想按小时数字分组。您想将每个不同的时间放在不同的组中,对吗?这意味着按年,月,日和小时分组。
执行此操作的一种方法是仅按格式将日期归类到一个小时:
.collect(Collectors.groupingBy(x -> DateTimeFormatter.ofPattern("yyyyMMddHH").format(x));
或者,使用truncatedTo
将每个日期截断为小时:
.collect(Collectors.groupingBy(x -> x.truncatedTo(ChronoUnit.HOURS));
答案 1 :(得分:0)
您可以尝试按日期和小时将其分组:
objects().collect(
groupingBy(x -> x.getDate().get(ChronoField.DAY_OF_YEAR),
groupingBy(x -> x.getDate().get(ChronoField.HOUR_OF_DAY))));