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

Java 9如何将嵌套Map转换为以AggregatedKey为键的单层Map

Java 9 嵌套Map转聚合键单层Map实现方案

前置注意

你需要先确保AggregatedKey类已经正确重写了equals()和hashCode()方法,否则它作为Map的键会出现存取异常。

核心实现代码

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

// 假设你原始的嵌套Map实例为nestedMap
Map<KeyType1, Map<KeyType2, List<ValueType>>> nestedMap = getOriginalNestedMap();

Map<AggregatedKey, List<ValueType>> aggregatedMap = nestedMap.entrySet()
        .stream()
        // 展开内层Map的所有Entry
        .flatMap(outerEntry -> outerEntry.getValue()
                .entrySet()
                .stream()
                // 生成聚合键和对应值的Entry
                .map(innerEntry -> Map.entry(
                        new AggregatedKey(outerEntry.getKey(), innerEntry.getKey()),
                        innerEntry.getValue()
                ))
        )
        // 收集为目标Map
        .collect(Collectors.toMap(
                Map.Entry::getKey,
                Map.Entry::getValue
        ));

特殊场景适配

  • 存在重复聚合键的场景:如果业务中可能出现相同的AggregatedKey对应多个值的情况,需要指定合并策略避免抛出IllegalStateException,示例如下:
.collect(Collectors.toMap(
        Map.Entry::getKey,
        Map.Entry::getValue,
        // 重复键时保留先遍历到的值,可根据业务调整合并逻辑
        (oldVal, newVal) -> oldVal
));
  • 需要生成指定类型Map的场景:如果需要返回TreeMap等自定义Map实现,可在toMap中指定供应商参数:
.collect(Collectors.toMap(
        Map.Entry::getKey,
        Map.Entry::getValue,
        (oldVal, newVal) -> oldVal,
        TreeMap::new
));

代码说明

Java 9 新增的Map.entry()方法可以直接创建不可变的Entry实例,相比Java 8及更早版本需要使用new AbstractMap.SimpleEntry()的写法更简洁。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 09:00:03