2

我是 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'))
}
4

1 回答 1

3

如果您想要简洁,您不会比使用标准库的当前版本更好(尽管请注意,您可以删除外括号以使其成为两行)。

Scalaz提供了一些工具,可以使这种事情更加简洁,包括一个 monoid 实例Map和一个 pimpedunionWith方法:

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)

请注意,这两种方法的行为与您的略有不同——如果第一个中的键不在第二个中,它们不会在运行时阻塞,并且它们不会默默地忽略第二个中的键不是第一个。

于 2012-10-26T10:09:16.993 回答