在Haskell中,有一个名为fromListWith的函数可以从函数生成Map(用于合并具有相同键的值)和列表:
fromListWith :: Ord k => (a -> a -> a) -> [(k, a)] -> Map k a
以下表达式将评估为true
:
fromListWith (++) [(5,"a"), (5,"b"), (3,"b"), (3,"a"), (5,"a")] == fromList [(3, "ab"), (5, "aba")]
在Scala中,toMap
个对象上有一个类似的List
函数,它也可以将列表转换为Map,但它不能有一个函数参数来处理重复的键
有没有人有这方面的想法?
答案 0 :(得分:9)
除了使用scalaz
之外,您还可以自己定义一个:
implicit class ListToMapWith[K, V](list: List[(K, V)]) {
def toMapWith(op: (V, V) => V) =
list groupBy (_._1) mapValues (_ map (_._2) reduce op)
}
以下是一个用法示例:
scala> val testList = List((5,"a"), (5,"b"), (3,"b"), (3,"a"), (5,"a"))
scala> testList toMapWith (_ + _)
res1: scala.collection.immutable.Map[Int,String] = Map(5 -> aba, 3 -> ba)
答案 1 :(得分:4)
stdlib没有这样的功能,但Data.Map
中有一个scalaz
端口,does have此功能可用。