如何简洁地将 Map 映射到 Map
How to succinctly map Map to Map
"map map to map", 真是一口.
反正我能做到:
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)}
,但这并没有回答我的第一个问题,这就是为什么我天真的第一种方法不起作用。
它不起作用,因为 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 编译器),这将是开箱即用的。
"map map to map", 真是一口.
反正我能做到:
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)}
,但这并没有回答我的第一个问题,这就是为什么我天真的第一种方法不起作用。
它不起作用,因为 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 编译器),这将是开箱即用的。