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

Scala: Why the mutable value inside Map cannot be changed if the Map is created from GroupBy

我想创建一个 Map 对象,键为整数,值为可变 Set。但是,当我从 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 时,它 运行 是您的转换,returns 一个 Set 加 99,然后 舍弃它

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

如果上面的内容看起来不太清楚,请尝试运行将此片段作为示例:

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

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

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