我有一个地图,其中的关键是一个字符串和值是一个Int,但表示为一个字符串。在斯卡拉转换地图[字符串,字符串]映射[字符串,诠释]
scala> val m = Map("a" -> "1", "b" -> "2", "c" -> "3")
m: scala.collection.immutable.Map[String,String] = Map(a -> 1, b -> 2, c -> 3)
现在我想将其转换成一个Map[String, Int]
我有一个地图,其中的关键是一个字符串和值是一个Int,但表示为一个字符串。在斯卡拉转换地图[字符串,字符串]映射[字符串,诠释]
scala> val m = Map("a" -> "1", "b" -> "2", "c" -> "3")
m: scala.collection.immutable.Map[String,String] = Map(a -> 1, b -> 2, c -> 3)
现在我想将其转换成一个Map[String, Int]
scala> m.mapValues(_.toInt)
res0: scala.collection.immutable.Map[String,Int] = Map(a -> 1, b -> 2, c -> 3)
正如Brian的回答显示,mapValues
是做到这一点的最好办法。
您可以实现使用模式匹配相同的效果,这应该是这样的:
m.map{ case (k, v) => (k, v.toInt)}
和(如果你想改变的关键,以及例如)在其他情况下非常有用。
请记住,您正在对Map
中的每个条目进行模式匹配,表示为tuple2,而不是整个地与Map
对齐。
您还必须使用围绕case
声明的大括号{}
,以保持编译器的快乐。
花括号不是强制性的,但风格上更好。 – euphoria83
在这种特殊情况下(不是双关语),它们是必需的。用圆括号替换它们会产生:'错误:简单表达式的非法启动“。另见http://stackoverflow.com/a/4387118/699224 – DNA
注意:与大多数Scala中的集合转换不同,'mapValues'是懒惰的 - 每次引用地图值时都会应用转换函数。 – ghik