Java实现将等长列表组成的Map合并为Map列表的代码求助
实现Map中等长List的1:1映射合并为Map列表(Java)
你的现有实现思路完全正确——通过按索引遍历,把每个Key对应List的同位置元素组合成单个Map,最终收集成列表,这个逻辑正好匹配你要的1:1映射需求,而不是全组合。不过我们可以从健壮性和简洁性上做些优化,让代码更通用、更安全:
优化方向说明
- 去掉对特定Key(比如
userid)的硬依赖,避免该Key不存在时的空指针 - 增加前置校验:确保所有List长度一致、Map不为空,提前拦截异常
- 利用Java 8+的Stream API简化代码,让逻辑更直观
优化后的代码实现
版本1:基于循环的健壮版
这个版本保留你熟悉的循环逻辑,同时补上边界校验:
import java.util.*; import com.alibaba.fastjson.JSONArray; public class MapMergeUtil { public static JSONArray mergeMapToList(Map<String, List<Object>> inputMap) { // 前置校验:空Map直接返回空数组 if (inputMap == null || inputMap.isEmpty()) { return new JSONArray(); } // 获取第一个List的长度作为基准,同时校验所有List长度一致 int targetSize = inputMap.values().iterator().next().size(); for (List<Object> list : inputMap.values()) { if (list == null || list.size() != targetSize) { throw new IllegalArgumentException("所有List必须非空且长度一致"); } } List<Map<String, Object>> resultList = new ArrayList<>(); for (int i = 0; i < targetSize; i++) { Map<String, Object> singleMap = new HashMap<>(); for (Map.Entry<String, List<Object>> entry : inputMap.entrySet()) { singleMap.put(entry.getKey(), entry.getValue().get(i)); } resultList.add(singleMap); } JSONArray jsonArray = new JSONArray(); jsonArray.addAll(resultList); return jsonArray; } public static void main(String[] args) { Map<String, List<Object>> map = new HashMap<>(); map.put("userid", Arrays.asList(1, 2, 3)); map.put("username", Arrays.asList("a","b","c")); map.put("country", Arrays.asList("UK","IN","US")); System.out.println(mergeMapToList(map)); } }
版本2:Java 8 Stream简化版
如果你的项目已经使用Java 8+,可以用Stream API让代码更简洁:
import java.util.*; import java.util.stream.Collectors; import java.util.stream.IntStream; import com.alibaba.fastjson.JSONArray; public class MapMergeUtil { public static JSONArray mergeMapToList(Map<String, List<Object>> inputMap) { if (inputMap == null || inputMap.isEmpty()) { return new JSONArray(); } int targetSize = inputMap.values().iterator().next().size(); // 校验所有List长度一致 boolean allSameSize = inputMap.values().stream() .allMatch(list -> list != null && list.size() == targetSize); if (!allSameSize) { throw new IllegalArgumentException("所有List必须非空且长度一致"); } // 用IntStream生成索引,每个索引对应一个组合后的Map List<Map<String, Object>> resultList = IntStream.range(0, targetSize) .mapToObj(i -> inputMap.entrySet().stream() .collect(Collectors.toMap( Map.Entry::getKey, entry -> entry.getValue().get(i) ))) .collect(Collectors.toList()); JSONArray jsonArray = new JSONArray(); jsonArray.addAll(resultList); return jsonArray; } public static void main(String[] args) { Map<String, List<Object>> map = new HashMap<>(); map.put("userid", Arrays.asList(1, 2, 3)); map.put("username", Arrays.asList("a","b","c")); map.put("country", Arrays.asList("UK","IN","US")); System.out.println(mergeMapToList(map)); } }
核心优化点解释
- 前置校验:提前检查空Map、List为空或长度不一致的情况,避免运行时出现
NullPointerException或IndexOutOfBoundsException,同时给出明确的错误提示 - 移除硬编码Key:用
inputMap.values().iterator().next()获取第一个List的长度作为基准,不再依赖特定Key,适配任意合法的输入Map - Stream版的优势:用声明式的方式表达逻辑,代码更紧凑,同时保留了1:1映射的核心逻辑
你的原始实现其实已经很好地解决了问题,优化后的版本主要是提升了代码的通用性和安全性,适配更多边界场景。
内容的提问来源于stack exchange,提问作者Vick
相关产品推荐
相关产品推荐

