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
相关产品推荐
相关产品推荐

