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 )
答案 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)