Solution1: foldLeft
scala> val merged = (m1 /: m2) { case (map, (k,v)) =>
map + ( k -> (v + map.getOrElse(k, 0)) )
}
merged: scala.collection.immutable.Map[Int,Int] = Map(1 -> 10, 2 -> 9, 4 -> 8)
这部分代码比较抽象,其中(m1 /: m2) 等价于 m2.foldLeft(m1),可以形象地理解为向左折叠。而foldLeft参数需要接收两个,另外一个参数列表使用case 匹配到一个结果map 和 当前m1中的一个(k,v) pair,这个pair就是foldLeft过程中遍历的每一个值。通过这些操作最终获得我们需要的结果,这个方法已经够简洁高效了,还有更简单的方法吗?有的。
Solution2: scalaz
scalaz封装了一个更加优美的二元函数操作符|+|,直接操作两个Map就能得到结果。首先启动scala时附带加入scalaz的包。