我想创建一个Map对象,键为整数,值为可变Set。但是,当我从GroupBy
函数创建Map对象时,可变集合中的值无法再更改。谁能告诉我为什么会这样?
import scala.collection.mutable
val groupedMap: Map[Int, mutable.Set[Int]] =
List((1,1),(1,2),(2,3))
.groupBy(_._1)
.mapValues(_.map(_._2).to[mutable.Set])
val originalMap: Map[Int, mutable.Set[Int]] =
Map(1 -> mutable.Set(1, 2), 2 -> mutable.Set(3))
println(groupedMap) // Map(1 -> Set(1, 2), 2 -> Set(3))
println(originalMap) // Map(1 -> Set(1, 2), 2 -> Set(3))
groupedMap(1) += 99
originalMap(1) += 99
println(groupedMap) // Map(1 -> Set(1, 2), 2 -> Set(3)) <- HERE IS THE PROBLEM, THE VALUE 99 CAN NOT BE ADDED TO MY MUTABLE SET!
println(originalMap) // Map(1 -> Set(99, 1, 2), 2 -> Set(3))
答案 0 :(得分:11)
.mapValues
是惰性的,这意味着您赋予它的函数在每次访问该值时都会执行,因此,当您执行groupedMap(1) += 99
时,它将运行转换,并返回Set
到您添加99,然后丢弃。
然后,当您打印它时,它将再次运行转换...并打印原始内容。
如果以上内容不清楚,请尝试运行以下代码段作为示例:
val foo = Map("foo" -> "bar")
.mapValues { _ => println("mapValues"); "baz" }
println(foo("foo") + foo("foo"))
这是使用可变数据时遇到的许多问题之一。不要这样在Scala中有99%的用例是不需要的。因此,最好假装它根本不存在,直到您对语言有足够的了解,以便能够确定确定剩余的1%。