You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将含LocalDate属性的对象列表转换为Map<Integer, Map<Month, List<K>>>?

实现Map<Integer, Map<Month, List>>的嵌套分组方案

嘿,这个多级分组的需求我之前也遇到过,用Java Stream API就能非常简洁地实现,完全不用手动写嵌套循环去逐个put元素。我给你理清楚思路和具体代码:

核心思路:利用Stream的多级分组Collector

本质上这是一个两层分组的场景:先按年份把对象分成大组,每个大组里再按月份分成小组,每个小组对应同一年同月的对象列表。Java的Collectors.groupingBy支持嵌套使用,刚好能满足这个需求。

具体步骤&代码示例

假设你的实体类叫TargetObject,里面包含LocalDate类型的日期属性(比如叫getDate()),具体实现如下:

import java.time.LocalDate;
import java.time.Month;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

// 示例实体类
class TargetObject {
    private LocalDate date;
    // 其他属性、构造方法、getter/setter
    
    public TargetObject(LocalDate date) {
        this.date = date;
    }
    
    public LocalDate getDate() {
        return date;
    }
}

public class NestedGroupingDemo {
    public static void main(String[] args) {
        // 模拟你的对象列表
        List<TargetObject> objectList = List.of(
            new TargetObject(LocalDate.of(2023, 5, 10)),
            new TargetObject(LocalDate.of(2023, 5, 20)),
            new TargetObject(LocalDate.of(2023, 6, 5)),
            new TargetObject(LocalDate.of(2024, 1, 15))
        );

        // 核心嵌套分组实现
        Map<Integer, Map<Month, List<TargetObject>>> nestedMap = objectList.stream()
            // 先过滤可能的空日期,避免NPE
            .filter(obj -> obj.getDate() != null)
            .collect(Collectors.groupingBy(
                // 外层分组键:年份(Integer类型)
                obj -> obj.getDate().getYear(),
                // 内层分组:按Month枚举分组,值为对象列表
                Collectors.groupingBy(
                    obj -> obj.getDate().getMonth(),
                    Collectors.toList()
                )
            ));

        // 测试输出验证结果
        nestedMap.forEach((year, monthGroup) -> {
            System.out.println("年份:" + year);
            monthGroup.forEach((month, objects) -> {
                System.out.println("  月份:" + month + ",包含对象数:" + objects.size());
            });
        });
    }
}

额外注意事项

  • 空值处理:如果你的对象列表中存在日期为null的元素,一定要加上.filter(obj -> obj.getDate() != null),否则会抛出NullPointerException。
  • 类型安全:用Month枚举作为内层键比用Integer存月份更安全,避免出现13这类无效月份值。
  • 自定义列表处理:如果需要对最终的对象列表做排序、去重等操作,可以把Collectors.toList()替换成Collectors.collectingAndThen(Collectors.toList(), list -> { /* 自定义处理逻辑 */ return list; })。

内容的提问来源于stack exchange,提问作者V.Junior

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 07:06:49