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

如何使用Java Stream合并含重复键的数组映射Map?

用Java Stream合并两个含列表值的Map(处理重复键)

当然可以用Stream完成这个合并任务!你之前的代码抛出异常,是因为Collectors.toMap()的默认行为是遇到重复键时直接抛出IllegalStateException——它不知道该怎么处理两个冲突的值。咱们只需要给它传入一个合并函数,告诉它遇到重复键时要把两个列表合并起来就行。

修正后的Stream实现代码

Map<String, List<String>> map3 = Stream.of(map1, map2)
    .flatMap(map -> map.entrySet().stream())
    .collect(Collectors.toMap(
        Map.Entry::getKey,
        // 把每个entry的value转换成新的ArrayList(避免原列表不可变导致的异常)
        e -> new ArrayList<>(e.getValue()),
        // 合并函数:遇到重复键时,将新列表元素追加到已有列表
        (existingList, newList) -> {
            existingList.addAll(newList);
            return existingList;
        }
    ));

代码细节解释

  1. Stream.of(map1, map2).flatMap(...):将两个Map的entrySet合并成一个统一的Stream,让我们能一次性处理所有键值对。
  2. Collectors.toMap的三个核心参数:
    • 第一个参数Map.Entry::getKey:指定用原entry的key作为新Map的key。
    • 第二个参数e -> new ArrayList<>(e.getValue()):这里特意将原列表转为ArrayList,是因为Arrays.asList()返回的是不可变列表,直接调用addAll会抛出UnsupportedOperationException,用可变列表更安全。
    • 第三个参数是关键的合并逻辑:当同一个key重复出现时,把新列表的所有元素追加到已存在的列表中,返回合并后的列表作为该key的最终值。

另一种更直观的Stream实现(Java 9+)

如果你觉得toMap的合并函数写起来有点繁琐,也可以用groupingBy配合flatMapping实现,逻辑更清晰:

Map<String, List<String>> map3 = Stream.of(map1, map2)
    .flatMap(map -> map.entrySet().stream())
    .collect(Collectors.groupingBy(
        Map.Entry::getKey,
        Collectors.flatMapping(e -> e.getValue().stream(), Collectors.toList())
    ));

这个方式的思路是:先按key分组,再把每个分组内的所有列表元素扁平化为一个单一列表,最终得到每个key对应的合并后列表。

关于迭代实现的补充

当然,用迭代的方式也能完成需求,代码更直白,适合Java版本较低的场景:

Map<String, List<String>> map3 = new HashMap<>(map1);
for (Map.Entry<String, List<String>> entry : map2.entrySet()) {
    map3.merge(entry.getKey(), entry.getValue(), (list1, list2) -> {
        List<String> merged = new ArrayList<>(list1);
        merged.addAll(list2);
        return merged;
    });
}

这里用到的Map.merge()方法,和Stream里的合并逻辑本质是一样的。

总结一下:Stream完全可以胜任这个合并需求,只需要正确配置Collectors.toMap的合并函数,或者用groupingBy+flatMapping的组合就行~

内容的提问来源于stack exchange,提问作者djm.im

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 04:11:17