我是Scala的新手,我正在寻找一种更简洁的方法来对地图值进行求和和分组。有没有比以下代码更好的方法:
def mapSum(thisMap: Map[Char, Int], thatMap: Map[Char, Int]) = {
thisMap.transform { (k, v) => thatMap(k) + v }
}
哪个会满足以下测试:
@Test
def mapSum() {
val map: Map[Char, Int] = Map('C' -> 1, 'D' -> 3)
val newMap = mapSum(map, map)
assertEquals(2, newMap('C'))
assertEquals(6, newMap('D'))
}
答案 0 :(得分:3)
如果你想要简洁,你不会比使用标准库的当前版本好多了(虽然请注意你可以放下外括号使其成为双线)。
Scalaz提供了一些可以使这种事情更简洁的工具,包括Map
的monoid实例和一个拉皮条unionWith
方法:
scala> import scalaz._, Scalaz._
import scalaz._
import Scalaz._
scala> val m = Map('C' -> 1, 'D' -> 3)
m: scala.collection.immutable.Map[Char,Int] = Map(C -> 1, D -> 3)
scala> m |+| m
res0: scala.collection.immutable.Map[Char,Int] = Map(C -> 2, D -> 6)
scala> (m unionWith m)(_ + _)
res1: Map[Char,Int] = Map(C -> 2, D -> 6)
请注意,这两种方法的行为与您的方法略有不同,但是如果第一个中的键不在第二个中,它们不会在运行时阻塞,并且它们不会静默地忽略第二个不在第一个。