如何修改包含集合的 Map 的值,返回一个新的 Map?

fre*_*oma 1 functional-programming scala immutability

给定 a Map[Int, Set[Int]],如何修改 Map 的单个值,在此过程中生成一个新值,例如:

val x = Map(1 -> Set(1,2,3))
x(1) + 5 // This creates a new Set, but not a new Map

val y = x(1) change { x => x + 5 }
// The previous functionality is what I'm looking for
// z: Set[Int]] = List(Set(1, 2, 3, 5))
Run Code Online (Sandbox Code Playgroud)

Ben*_*mes 5

正如罗宾格林所建议的那样,镜头是为这项工作而制造的。事实上,你想要一个部分镜头,因为地图是键 -> 值的部分函数。

Scalaz 7 包括将mapVPLens部分镜头 ( PLens) 设置为选定键处的值的函数:

import scalaz.PLens._
val x = Map(1 -> Set(1,2,3))

mapVPLens(1) mod ((_: Set[Int]) + 5, x) // Map(1 -> Set(1, 2, 3, 5))
Run Code Online (Sandbox Code Playgroud)

修改不存在的键的值将不起作用:

mapVPLens(9) mod ((_: Set[Int]) + 5, x) // Map(1 -> Set(1,2,3))
Run Code Online (Sandbox Code Playgroud)