[英]Map both keys and values of a Scala Map
Scala's MapLike
trait has a method Scala的MapLike
特性有一种方法
mapValues [C] (f: (B) ⇒ C): Map[A, C]
But I sometimes want a different type: 但我有时想要一种不同的类型:
mapKeysAndValues [C] (f: (A, B) ⇒ C): Map[A, C]
Is there a simple way to do this which I am missing? 有一种简单的方法可以做到这一点,我错过了吗? Of course, this can be done with a fold. 当然,这可以通过折叠来完成。
map
method iterates though all (key, value)
pairs. map
方法迭代所有(key, value)
对。 You can use it like this: 你可以像这样使用它:
val m = Map("a" -> 1, "b" -> 2)
val incM = m map {case (key, value) => (key, value + 1)}
What about this code: 这段代码怎么样:
val m = Map(1 -> "one", 2 -> "two")
def f(k: Int, v: String) = k + "-" + v
m map {case (k, v) => (k, f(k, v))}
Which produces: 哪个产生:
Map(1 -> 1-one, 2 -> 2-two)
This can be packaged into utility method: 这可以打包成实用方法:
def mapKeysAndValues[A,B,C](input: Map[A,B], fun: (A, B) => C) =
input map {case(k,v) => (k, fun(k, v))}
Usage: 用法:
mapKeysAndValues(
Map(1 -> "one", 2 -> "two"),
(k: Int, v: String) => k + "-" + v
)
m map (t => (t._1, t._2 + 1))
m map (t => t._1 -> t._2 + 1)
With some Scalaz: 有些Scalaz:
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)
I like @tenshi's solution better. 我更喜欢@ tenshi的解决方案。
You could create a utility class: 您可以创建一个实用程序类:
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)
Code not tested but it should work somehow simmilar like that. 代码没有经过测试,但它应该以某种方式类似地工作。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.