项目场景:
java Steam流Collectors.groupingBy 分组 抽取LocalDateTime类型时间格式字段为key
问题描述
如下写法通过对象字段获取key,当时间对象类型为LocalDateTime
时,时间中间会携带一个大型字母T
var resultMap = result.stream().collect(Collectors.groupingBy(XXXXX对象::getCreateTime));
result 是一个List对象集合
分组结果显示:
{ "2024-08-23T16:30:23": [
{
XXX 对象内容
}]
,"2024-08-23T17:30:23": [
{
XXX 对象内容
}]
}
原因分析:
出现这这种情况的原因是因为LocalDateTime 类,toString写法原因,方法源码如下:
@Override
public String toString() {
return date.toString() + 'T' + time.toString();
}
解决方案:
1.可以在字段上面增加@JsonFormat(pattern = "yyyy/MM/dd HH:00:00")
这个方式只能解决对象本身的问题,无法处理到Map中的key值 情况如下:
{ "2024-08-23T16:30:23": [
{
"createTime":"2024/08/23 16:00:00"
}]
}
2.此时使用 groupingBy 自定义key值的用法,对时间值进行一次格式化如下:
var resultMap = result.stream().distinct().collect(Collectors.groupingBy(p -> DateUtil.format(p.getCreateTime(), "yyyy/MM/dd HH:00:00")));
处理结果如下:
{ "2024-08-23 16:00:00": [
{
"createTime":"2024/08/23 16:00:00"
}]
}
建议:如有需要使用groupingBy 分组建议使用自定义key用法,该用法相对灵活
以上数据为模拟数据!仅供参考