2017-03-21 57 views
1

「地圖映射到地圖」,多麼滿口。如何簡潔地將地圖映射到地圖

反正,我可以這樣做:

val list = List(1, 2, 3) 
val list2 = list map (item => item + 1) 
println(list2) 
// List(2, 3, 4) 

爲什麼下面不工作?:

val ages = Map("alice" -> 21, "bob" -> 22) 
val ages2 = ages map ((name, age) => (name, age + 1)) 

,以及如何去製作它的工作?

編輯: 我想通了,我不得不這樣做:

val ages2 = ages map {case (name, age) => (name, age + 1)} 

,但這並沒有回答我的第一個問題,這就是爲什麼我天真的第一種方法是行不通的。

+3

我知道這不是問題,但如果您不需要更改'Map'的關鍵部分,則可以使用'mapValues'方法(懶惰地)對這些值應用函數。例如,在這裏,你可以做'ages2.mapValues(_ + 1)'。 –

+0

包括錯誤信息本來是個好主意。它也可能指出你在正確的方向 –

回答

4

它不起作用,因爲Scala編譯器不會自動分解Map中的Tuple2(這是鍵值對的類型)。

這會工作:

val ages2 = ages.map(pair => (pair._1, pair._2 + 1)) 

,因爲它使用的元組參數作爲一個整體。

正如你已經注意到,使用部分函數的語法也工作,並允許您自動分解的元組:

val ages2 = ages map { case (name, age) => (name, age + 1) } 

這是目前的編譯器的限制。使用dotty(新的Scala新編譯器),它將被直接提供。

相關問題