Java中如何将含子实体的List<Entity>转换为Map<String, Entity>
层级实体转Map的实现方案
问题背景
定义的Entity类如下:
public class Entity { private String id; private List<Entity> children; // getters, constructor, etc. }
需要将输入的List<Entity>转换为Map<String, Entity>,要求Map中包含所有层级的实体,键为实体的id,值为对应的Entity对象。现有实现仅处理了顶层实体,不知道如何遍历子实体完成全层级的收集:
public static Map<String, Entity> group(List<Entity> entities) { Map<String, Entity> map = new HashMap<>(); for (Entity e : entities) { if (!map.containsKey(e.getId())) { map.put(e.getId(), ??? e.getChildren() ???); // 此处困惑 } } return map; }
示例数据格式:
[ { "id": "bos", "children":[ { "id": "manager1", "children": [{"id": "worker11"}, {"id": "worker12"}] }, { "id": "manager2", "children": [{"id": "worker21"}, {"id": "worker22"}] } ] } ]
实现方案
要覆盖所有层级的实体,需要通过递归遍历每个实体及其子实体,将所有实体逐一加入Map。具体实现如下:
import java.util.HashMap; import java.util.List; import java.util.Map; public class EntityUtils { public static Map<String, Entity> group(List<Entity> entities) { Map<String, Entity> entityMap = new HashMap<>(); // 遍历顶层实体,逐个处理自身及子实体 for (Entity entity : entities) { addAllLevels(entity, entityMap); } return entityMap; } // 递归方法:添加当前实体及其所有层级的子实体到Map private static void addAllLevels(Entity entity, Map<String, Entity> map) { // 将当前实体存入Map(若id重复,后续实体将覆盖之前的,可根据业务调整逻辑) map.put(entity.getId(), entity); // 处理子实体:若子列表不为空,递归遍历每个子实体 List<Entity> children = entity.getChildren(); if (children != null && !children.isEmpty()) { for (Entity child : children) { addAllLevels(child, map); } } } }
说明
- 核心逻辑是递归:先将当前实体加入Map,再对每个子实体重复执行相同操作,确保所有层级的实体都被收集。
- 若存在重复id的实体,后续加入的实体会覆盖之前的。如果需要保留首次出现的实体,可以在
map.put()前增加判断:if (!map.containsKey(entity.getId()))。 - 运行示例数据后,Map中将包含以下键值对:
bos、manager1、worker11、worker12、manager2、worker21、worker22,对应所有层级的实体对象。
内容的提问来源于stack exchange,提问作者Balakirethiga R
相关产品推荐
相关产品推荐

