我有一个包含字段生成时间的对象列表,其中我通过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实现它。
答案 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来获取该时间戳的小时数。更改时区以满足您的需求。