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

