替换ListMap的mapValues

时间:2015-04-07 07:55:47

标签: scala dictionary

Scala immutable Map有一个成员mapValues,它允许仅对值(而不是键)执行映射。使用immutable ListMap代替时,此成员会被继承,但不会被覆盖,因此它仍会返回Map,而不是ListMap

是否有一些简单的方法如何为mapValues实现ListMap

在以下片段中,我希望返回类型为ListMap,而不是Map

import scala.collection.immutable.ListMap

val lm = ListMap(1 -> "1", 0 -> "0", 2 -> "2")

lm.mapValues ( v => v+v )

2 个答案:

答案 0 :(得分:2)

怎么样:

def listMapValues[K,V1,V2](lm:ListMap[K,V1], f: V1 => V2) = lm.map { case (k,v1) => (k,f(v1))}

然后您可以像:

一样使用它
scala> listMapValues(lm, v => v + v)
res16: scala.collection.immutable.ListMap[Int,String] = Map(1 -> 11, 0 -> 00, 2 -> 22)

如果要将其用作中缀方法,只需将其声明为隐式类:

 implicit class ListMapOps[K,V1](lm: ListMap[K,V1]) { 
    def listMapValues[V2](f: V1 => V2)= lm.map { case (k,v1) => (k,f(v1))}
  }


scala> lm.listMapValues( v => v + v )
res17: scala.collection.immutable.ListMap[Int,String] = Map(1 -> 11, 0 -> 00, 2 -> 22)

答案 1 :(得分:2)

你可以这样做。

ListMap[Int, String]().empty ++ lm.mapValues(v => v + v)

您的代码:

import scala.collection.immutable.ListMap
  val lm: ListMap[Int, String] = ListMap(1 -> "1", 0 -> "0", 2 -> "2")
  val result: ListMap[Int, String] = ListMap[Int, String]().empty ++ lm.mapValues(v => v + v)

REPL的输出:

import scala.collection.immutable.ListMap
lm: scala.collection.immutable.ListMap[Int,String] = Map(1 -> 1, 0 -> 0, 2 -> 2)
result: scala.collection.immutable.ListMap[Int,String] = Map(1 -> 11, 0 -> 00, 2 -> 22)