根据小时分组数据

时间:2019-06-25 14:37:56

标签: java java-8 java-stream java-time

我有一个包含字段生成时间的对象列表,其中我通过System.currentTimeInMills()函数以长格式存储时间。数据如下所示:

List<MyObject> myObj = Arrays.asList(
    new MyObject(time="1561473186140", name="123", status=200)
    new MyObject(time="1561473186123", name="ABC", status=200)
    new MyObject(time="1561473183435", name="ABC", status=200)
    new MyObject(time="1561473185666", name="123", status=200)
    new MyObject(time="1561473186132", name="ABC", status=200)
    new MyObject(time="1561473183423", name="ABC", status=200)
    new MyObject(time="1561473184242", name="123", status=200)
    new MyObject(time="1561473186190", name="ABC", status=200)
    new MyObject(time="1561473186098", name="ABC", status=200)
);

现在,我必须根据小时基准对数据进行分组。就像从10 AM-11AM开始一样,那里有多少个对象,例如11 AM-12PM等。那么如何使用Java 8 Stream API实现它。

2 个答案:

答案 0 :(得分:1)

如果要按小时分组对象组:

Map<Integer, List<MyObject>> result = myObj.stream().collect(Collectors.groupingBy(o -> LocalDateTime.ofInstant(Instant.ofEpochMilli(o.getTimestamp()), ZoneId.systemDefault()).getHour()));

如果仅需要对象数量,则不需要对象本身:

myObj.stream().collect(Collectors.groupingBy(o -> LocalDateTime.ofInstant(Instant.ofEpochMilli(o.getTimestamp()), ZoneId.systemDefault()).getHour(), Collectors.counting()));

答案 1 :(得分:0)

尝试一下:

Map<Integer, List<MyObject>> result = list.stream()
        .collect(Collectors.groupingBy(o -> Instant.ofEpochMilli(o.getTime())
                .atZone(ZoneOffset.UTC).getHour()));

result.forEach((hour, objects) -> 
        System.out.println(hour + " - " + (hour + 1) + ": " + objects));

这使用Java Time API来获取该时间戳的小时数。更改时区以满足您的需求。