Scala:如果 Map 是从 GroupBy 创建的,为什么 Map 中的可变值不能更改

标签 scala dictionary group-by set mutable

我想创建一个 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,然后将其丢弃。

然后,当您打印它时,它会再次运行转换……并打印原始内容。

如果以上内容看起来不清楚,请尝试运行此代码段作为说明:

 val foo = Map("foo" -> "bar")
   .mapValues { _ => println("mapValues"); "baz" }

 println(foo("foo") + foo("foo"))

这是您在使用可变数据时遇到的众多问题之一。不要这样做。在 Scala 中 99% 的用例中都不需要它。因此,最好假装它根本不存在,直到您对语言有足够的掌握,从而能够明确确定剩余的 1%。

关于Scala:如果 Map 是从 GroupBy 创建的,为什么 Map 中的可变值不能更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55195326/

相关文章:

scala - 异步事务导致IllegalStateException

用于 postgresql 的 Scala Lift 数据库连接

scala - 与泛型匹配的模式

unit-testing - Scalacheck 不会正确报告失败的情况

python - 正则表达式查找并替换为字典

python - 在运行时 append 到字典

python - 将详细信息附加到字典时出现关键错误

mysql - sql分组计算

MySQL 一个查询按 n 行分组,组内最大和最小值,可能吗?

Python Pandas - 创建一个函数来替换重复的 DataFrame