Java中构建嵌套Map后,如何正确检索嵌套键值对?
Java嵌套集合的构建与嵌套键值检索问题
问题根源
Java原生HashMap不支持"buildings.buildingid"这种路径式键查询。get()方法只会匹配顶层Map中的直接键,你的queryMap里只有"buildings"这一个顶层键,所以用"buildings.buildingid"作为键查询必然返回null。
原生Java实现:手动遍历取值
要获取所有buildingid的值,需要逐层遍历嵌套结构:
- 从外层Map取出
"buildings"对应的List - 遍历List中的每个内部Map
- 提取每个Map中的
"buildingid"值并收集
代码示例:
// 取出顶层Map中"buildings"对应的列表 List<Map> buildingsList = queryMap.get("buildings"); // 用于收集所有buildingid的容器 List<Object> buildingIds = new ArrayList<>(); // 遍历每个建筑对应的Map for (Map buildingMap : buildingsList) { // 注意你的buildingid是List类型(比如[3]),这里强转后取第一个元素 List<Integer> idList = (List<Integer>) buildingMap.get("buildingid"); buildingIds.add(idList.get(0)); } // 包装成你期望的[[3,1,4]]嵌套格式 List<List<Object>> result = new ArrayList<>(); result.add(buildingIds); System.out.println(result); // 输出 [[3, 1, 4]]
更优方案:使用自定义实体类
对于Java开发,用面向对象的实体类替代嵌套Map/List,代码可读性和可维护性会大幅提升:
- 定义
Building实体类
class Building { private String buildingName; private Integer buildingId; // 构造方法 public Building(String buildingName, Integer buildingId) { this.buildingName = buildingName; this.buildingId = buildingId; } // Getter方法 public Integer getBuildingId() { return buildingId; } // 可按需添加Setter和toString方法 }
- 构建集合并取值
// 构建建筑列表 List<Building> buildings = new ArrayList<>(); buildings.add(new Building("Building 3", 3)); buildings.add(new Building("Building 31", 1)); buildings.add(new Building("HFTF", 4)); // 存入外层Map(如果业务需要) HashMap<String, List<Building>> queryMap = new HashMap<>(); queryMap.put("buildings", buildings); // 用Stream流快速提取所有buildingid List<Integer> buildingIds = queryMap.get("buildings") .stream() .map(Building::getBuildingId) .toList(); // 包装成目标格式 List<List<Integer>> result = List.of(buildingIds); System.out.println(result); // 输出 [[3, 1, 4]]
可选:第三方工具库的路径查询
如果一定要用类似"buildings.buildingid"的路径语法,可以借助Apache Commons Collections、Jackson等第三方库,但对于编程新手,优先掌握原生Java的集合操作更扎实。
内容的提问来源于stack exchange,提问作者DerekYeeter
相关产品推荐
相关产品推荐

