我有一個地圖,其中的關鍵是一個字符串和值是一個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