2017-03-21 123 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新编译器),它将被直接提供。

相关问题