You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 17:35:24