映射Scala Map的键和值

斯卡拉的MapLike特质有一个方法

 mapValues [C] (f: (B) ⇒ C): Map[A, C] 

但我有时需要一个不同的types:

 mapKeysAndValues [C] (f: (A, B) ⇒ C): Map[A, C] 

有没有一个简单的方法来做到这一点,我失踪了? 当然,这可以做一个折叠。

map方法遍历所有(key, value)对。 你可以像这样使用它:

 val m = Map("a" -> 1, "b" -> 2) val incM = m map {case (key, value) => (key, value + 1)} 
 m map (t => (t._1, t._2 + 1)) m map (t => t._1 -> t._2 + 1) 

这个代码如何:

 val m = Map(1 -> "one", 2 -> "two") def f(k: Int, v: String) = k + "-" + v m map {case (k, v) => (k, f(k, v))} 

其中产生:

  Map(1 -> 1-one, 2 -> 2-two) 

这可以打包成实用程序的方法:

 def mapKeysAndValues[A,B,C](input: Map[A,B], fun: (A, B) => C) = input map {case(k,v) => (k, fun(k, v))} 

用法:

 mapKeysAndValues( Map(1 -> "one", 2 -> "two"), (k: Int, v: String) => k + "-" + v ) 

随着一些斯卡拉:

 scala> def fst[A, B] = (x: (A, B)) => x._1 fst: [A, B]=> (A, B) => A scala> Map(1 -> "Lorem", 2 -> "Ipsum").map(fst &&& Function.tupled(_.toString + _)) res1: scala.collection.immutable.Map[Int,java.lang.String] = Map(1 -> 1Lorem, 2 -> 2Ipsum) 

我更喜欢@ tenshi的解决scheme。

你可以创build一个实用程序类:

 class MyMapLike[K,V](m:MapLike[K,V,_]){ def mapKeysAndValues[R](f: (K, V) => R)={ m.map{case (k,v)=> f(k,v)} } } object MyMapLike{ implicit def maplike2mymaplike[K,V](ml:MapLike[K,V,_]):MyMapLike[K,V]=new MyMapLike(m) } import MyMapLike._ Map(1 -> "one", 2 -> "two").mapKeysAndValues(k,v=>v*k) 

代码没有经过testing,但它应该像这样工作。