如何组合包含相同类型的两个HashMap对象?

2022-08-31 05:20:46

我有两个对象是这样定义的:HashMap

HashMap<String, Integer> map1 = new HashMap<String, Integer>();
HashMap<String, Integer> map2 = new HashMap<String, Integer>();

我还有第三个对象:HashMap

HashMap<String, Integer> map3;

我怎样才能合并和一起变成?map1map2map3


答案 1
map3 = new HashMap<>();

map3.putAll(map1);
map3.putAll(map2);

答案 2

如果您知道没有重复的键,或者您希望 中的值覆盖重复键的值,则只需编写map2map1

map3 = new HashMap<>(map1);
map3.putAll(map2);

如果需要更好地控制值的组合方式,可以使用 Java 8 中添加的 Map.merge,它使用用户提供的用于合并重复键的值。 对单个键和值进行操作,因此您需要使用循环 或 .在这里,我们连接重复键的字符串:BiFunctionmergeMap.forEach

map3 = new HashMap<>(map1);
for (Map.Entry<String, String> e : map2.entrySet())
    map3.merge(e.getKey(), e.getValue(), String::concat);
//or instead of the above loop
map2.forEach((k, v) -> map3.merge(k, v, String::concat));

如果您知道自己没有重复的键并希望强制执行它,则可以使用合并函数来引发 :AssertionError

map2.forEach((k, v) ->
    map3.merge(k, v, (v1, v2) ->
        {throw new AssertionError("duplicate values for key: "+k);}));

从这个特定问题退后一步,Java 8流库提供了和收集器。如果在循环中重复合并映射,则可以重构计算以使用流,这既可以阐明代码,又可以使用并行流和并发收集器实现轻松并行。toMapgroupingBy