文
章
目
录
章
目
录
学习如何合并两个HashMap,可以选择忽略重复的键(覆盖值)或处理重复的键。
1.合并两个HashMap并忽略重复键
这是一个简单的解决方案。使用firstMap.putAll(secondMap)
方法,将secondMap中的所有映射复制到firstMap中。
由于我们知道HashMap不允许重复的键,所以当我们以这种方式合并这些映射时,对于firstMap中的重复键,其值将被secondMap中相同键的值覆盖。
让我们来看一个例子。在下面的例子中,两个映射都有一个键为“4”的条目。合并后,我们在最终映射中来自第二个映射的条目。
//map 1
HashMap<Integer, String> firstMap = new HashMap<>();
firstMap.put(1, "A");
firstMap.put(2, "B");
firstMap.put(3, "C");
firstMap.put(4, "D");
//map 2
HashMap<Integer, String> secondMap = new HashMap<>();
secondMap.put(4, "F"); //合并时它将用F代替D
secondMap.put(5, "G"); //添加新的键值对
//合并map
firstMap.putAll(secondMap);
System.out.println(firstMap);// 输出:{1=A, 2=B, 3=C, 4=F, 5=G}
2.合并两个Map并组合重复键的值
如果我们想处理映射中存在重复键的情况,并且不想丢失任何映射和键的数据,那么我们可以利用Java 8中添加的Map.merge()
函数。
merge()函数接受3个参数:键、值和用户提供的BiFunction
,用于合并重复键的值。
在我们的示例中,我们想要将重复键“4”的值(来自两个映射)追加在一起。
//map 1
HashMap<Integer, String> firstMap = new HashMap<>();
firstMap.put(1, "A");
firstMap.put(2, "B");
firstMap.put(3, "C");
firstMap.put(4, "D");
//map 2
HashMap<Integer, String> secondMap = new HashMap<>();
secondMap.put(4, "F"); //合并时它将用F代替D
secondMap.put(5, "G"); //添加新的键值对
//合并map
secondMap.forEach((key, value) -> firstMap.merge(key, value, String::concat));
System.out.println(firstMap); // 输出:{1=A, 2=B, 3=C, 4=DF, 5=G}
注意键“4”的值。在第一个映射中它的值为D,在第二个映射中为F。在合并的映射中,它是一个组合值,如”DF”。
我们可以在提供的BiFunction中编写任何合并逻辑。例如,如果我们想要追加值并在值D和F之间放置一个分隔符,那么我们可以编写自己的BiFunction。
secondMap.forEach(
(key, value) -> firstMap.merge(key, value, (v1, v2) -> v1.equalsIgnoreCase(v2) ? v1 : v1 + "-" + v2)
);
现在输出是一个连接的值,值D和F之间有一个分隔符:
{1=A, 2=B, 3=C, 4=D-F, 5=G}