如何将List<Map<String, String>>转换为Map<String, List<String>>?
将List<Map<String,String>>转换为Map<String, List>
现有如下集合数据:
List<Map<String,String>> recordListMap = new ArrayList<>(); Map<String,String> recordMap_1 = new HashMap<>(); recordMap_1.put("inputA", "ValueA_1"); recordMap_1.put("inputB", "ValueB_1"); recordListMap.add(recordMap_1); Map<String,String> recordMap_2 = new HashMap<>(); recordMap_2.put("inputA", "ValueA_2"); recordMap_2.put("inputB", "ValueB_2"); recordListMap.add(recordMap_2);
尝试了以下代码但未得到预期结果:
Map<String, List<String>> myMaps = new HashMap<>(); for (Map<String, String> recordMap : recordListMap) { for (Map.Entry<String, String> map : recordMap.entrySet()) { myMaps.put(map.getKey(), List.of(map.getValue())); } } // 输出结果: {inputB=[ValueB_2], inputA=[ValueA_2]}
预期结果:
{inputB=[ValueB_1, ValueB_2], inputA=[ValueA_1, ValueA_2]}
问题原因
你的代码每次遍历键值对时,都会创建一个仅包含当前值的新列表并覆盖原有键对应的列表,导致每个键最终只保留最后一次遍历到的元素。
解决方法
方法一:传统循环实现
通过computeIfAbsent方法确保每个键对应一个可追加的列表,避免覆盖:
Map<String, List<String>> myMaps = new HashMap<>(); for (Map<String, String> recordMap : recordListMap) { for (Map.Entry<String, String> entry : recordMap.entrySet()) { // 键不存在时创建新ArrayList,然后添加当前值 myMaps.computeIfAbsent(entry.getKey(), k -> new ArrayList<>()) .add(entry.getValue()); } }
方法二:Java 8+ Stream API实现
用流式操作简化代码,先展开所有键值对再分组收集:
import java.util.stream.Collectors; // ... Map<String, List<String>> myMaps = recordListMap.stream() .flatMap(map -> map.entrySet().stream()) .collect(Collectors.groupingBy( Map.Entry::getKey, Collectors.mapping(Map.Entry::getValue, Collectors.toList()) ));
两种方法执行后都会得到你预期的结果。
内容的提问来源于stack exchange,提问作者DeepakVerma
相关产品推荐
相关产品推荐

