我知道如何使用Map.Entry <>解决此问题,但我想知道是否可以用更短的方法完成。
问题陈述: 如果我必须合并两个地图,并假设它们都具有相同的键,请说 k1 ,而值要不同,请说 v1和v2 。 现在,生成的映射应具有键值对,如下所示: << strong> k1,v1 + v2 >
如果有人可以提出一个较短的方法,这将是一个很大的帮助。
答案 0 :(得分:2)
函数Map.merge()
在这方面可以为您提供帮助。来自Oracle的文档:
如果指定的键尚未与某个值关联或与null关联,请将其与给定的非null值关联。否则,用给定的重映射函数的结果替换关联的值,如果结果为null,则将其删除。当组合一个键的多个映射值时,此方法可能有用。
https://docs.oracle.com/javase/8/docs/api/java/util/Map.htm
这将检查地图中是否存在值,如果有,则对其应用函数。
合并值的功能取决于您的特定用例。例如,如果两个映射的键都表示IP地址,并且值表示它们访问URL的次数,则添加它们可能很有意义。在这种情况下,结果代码将是
Map<String, Integer> map1, map2; // populated and not null
map1.forEach((k, v) -> map2.merge(k, v, (v1, v2) -> v1 + v2));
为清楚起见,此代码:
map1
中的每一对(使用map1.forEach()
)(k, v) -> map2.merge(...);
应用于每个项目。map2.merge(k, v, (v1, v2) -> v1 + v2)
将两个值(如果两个都存在)加在一起,如果只有一个,则选择一个确实存在的值。结果存储在map2
中。