在Scala中,是否有相当于Haskell的"fromListWith"用于Map?

Han*_*Sun 8 haskell functional-programming scala

在Haskell中,有一个名为fromListWith的函数,它可以从函数生成Map(用于合并具有相同键的值)和列表:

fromListWith :: Ord k => (a -> a -> a) -> [(k, a)] -> Map k a
Run Code Online (Sandbox Code Playgroud)

以下表达式将评估为true:

fromListWith (++) [(5,"a"), (5,"b"), (3,"b"), (3,"a"), (5,"a")] == fromList [(3, "ab"), (5, "aba")]
Run Code Online (Sandbox Code Playgroud)

在Scala中,有一个类似于toMapon List对象的函数,它也可以将列表转换为Map,但它不能有一个函数参数来处理重复的键.

有没有人有这个想法?

Kol*_*mar 10

除了使用scalaz你还可以自己定义一个:

implicit class ListToMapWith[K, V](list: List[(K, V)]) {
  def toMapWith(op: (V, V) => V) = 
    list groupBy (_._1) mapValues (_ map (_._2) reduce op)
}
Run Code Online (Sandbox Code Playgroud)

这是一个用法示例:

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)
Run Code Online (Sandbox Code Playgroud)

  • 请注意,`mapValues`返回一个视图,该视图将重新计算每次访问的值,在这种情况下可能不需要. (2认同)