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

Java Streams如何按Map键的属性分组生成嵌套Map结构

实现方案

假设你已经为类A的b属性提供了符合Java Bean规范的getter方法getB(),可以直接用如下Stream操作完成分组:

import java.util.Map;
import java.util.stream.Collectors;

// 原有输入集合
Map<A, List<C>> originalMap = ...;

// 分组后的结果
Map<B, Map<A, List<C>>> result = originalMap.entrySet()
        .stream()
        .collect(Collectors.groupingBy(
                // 外层分组key:取entry的键A的属性b
                entry -> entry.getKey().getB(),
                // 下游收集器:把同个B对应的所有entry重新收集为Map<A, List<C>>
                Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)
        ));

特殊场景适配

  • 如果存在多个A实例的b属性相同、且A实例本身也重复的情况,需要给toMap方法补充冲突处理逻辑,避免抛出键重复异常:
    Map<B, Map<A, List<C>>> result = originalMap.entrySet()
            .stream()
            .collect(Collectors.groupingBy(
                    entry -> entry.getKey().getB(),
                    Collectors.toMap(
                            Map.Entry::getKey,
                            Map.Entry::getValue,
                            // 键重复时保留先出现的value,可根据业务需求调整
                            (oldVal, newVal) -> oldVal
                    )
            ));
    
  • 如果类A没有提供b的getter、且你可以直接访问属性b(比如属性是public的,或者和操作代码在同一个包下的包访问权限),可以直接把分组的key提取逻辑改成entry -> entry.getKey().b即可。

内容的提问来源于stack exchange,提问作者Vadym Mjakishew

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 10:21:03