You need to enable JavaScript to run this app. Java将三层嵌套List转换为三层嵌套Map的两种实现方案
优惠活动
大模型
产品
解决方案
定价
更多

Java将三层嵌套List转换为三层嵌套Map的两种实现方案

前置说明

  • 以下实现默认所有实体类的私有属性都提供了对应的public getter方法
  • 若使用State/City对象作为Map的key,必须手动重写两个类的equals()和hashCode()方法,否则会出现key匹配异常
  • 若存在同名的State或者同一State下存在同名City,需要在toMap方法中补充合并策略,示例中给出的默认合并写法可避免重名报错

实现代码

1. 以完整对象为key的嵌套Map

目标结构:Map<State, Map<City, List<Town>>>

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

// 此处country为已赋值的Country实例
Map<State, Map<City, List<Town>>> stateObjMap = country.getStates().stream()
        .collect(Collectors.toMap(
                // 第一层key:State对象本身
                state -> state,
                // 第一层value:城市维度嵌套Map
                state -> state.getCities().stream()
                        .collect(Collectors.toMap(
                                // 第二层key:City对象本身
                                city -> city,
                                // 第二层value:当前City所属的Town集合
                                City::getTowns,
                                // 同State下重名City合并策略,无重名可删除
                                (oldVal, newVal) -> oldVal
                        )),
                // 重名State合并策略,无重名可删除
                (oldVal, newVal) -> oldVal
        ));

2. 以名称为key的嵌套Map

目标结构:Map<String, Map<String, List<Town>>>

Map<String, Map<String, List<Town>>> stateNameMap = country.getStates().stream()
        .collect(Collectors.toMap(
                // 第一层key:State的name属性
                State::getName,
                // 第一层value:城市维度嵌套Map
                state -> state.getCities().stream()
                        .collect(Collectors.toMap(
                                // 第二层key:City的name属性
                                City::getName,
                                // 第二层value:当前City所属的Town集合
                                City::getTowns,
                                // 同State下重名City合并策略,无重名可删除
                                (oldVal, newVal) -> oldVal
                        )),
                // 重名State合并策略,无重名可删除
                (oldVal, newVal) -> oldVal
        ));

补充说明

示例中的合并策略(oldVal, newVal) -> oldVal表示出现重名key时保留先出现的value,可根据业务需求调整逻辑,比如需要合并两个Town列表时可改写为:

(oldVal, newVal) -> {
    oldVal.addAll(newVal);
    return oldVal;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.20 09:15:04