scala - Scala:如果 Map 是从 GroupBy 创建的,为什么不能更改 Map 中的可变值
问题描述
我想创建一个 Map 对象,其键为整数,值为可变集。但是,当我从GroupBy
函数创建 Map 对象时,我的可变 Set 中的值无法再更改。谁能告诉我为什么会这样?
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))
解决方案
.mapValues
是惰性的,这意味着您给它的函数在您每次访问该值时都会执行,因此,当您这样做时groupedMap(1) += 99
,它会运行您的转换,返回Set
您添加 99 的 a,然后丢弃它。
然后,当您打印它时,它会再次运行转换......并打印原始内容。
如果上述内容看起来不清晰,请尝试运行此代码段作为说明:
val foo = Map("foo" -> "bar")
.mapValues { _ => println("mapValues"); "baz" }
println(foo("foo") + foo("foo"))
这是您在使用可变数据时遇到的许多问题之一。不要这样做。在 Scala 中 99% 的用例中,它是不需要的。所以,最好只是假装它根本不存在,直到你对语言有足够的掌握,能够明确地确定剩下的 1%。
推荐阅读
- java - 如何使用 RandomAccessFile 恢复中断下载?
- python - 在 s3 中使用带有 put_object() 的 Expires 参数进行上传会在一段时间后从 s3 中删除文件
- angular - 为什么主页选项卡始终处于活动状态?
- c# - 有没有办法从 wpf Livecharts Graph 的图例中只删除一个 lineeries?
- google-bigquery - Bigquery 临时表位置 EU 而不是 US
- filter - 有没有办法使用 Lucene 过滤器删除所有特殊字符?
- javascript - React setState 回调不会更新状态
- pandas - 将 Dataframe 变成字典 Pandas
- javascript - 未捕获的 ReferenceError:我的 javascript 中未定义文本
- java - 哪个更有效率?为地图值的临时结果声明一个对象?还是直接从地图根中获取?