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

问题描述 投票:2回答:1

我想创建一个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))
scala dictionary group-by set mutable
1个回答
11
投票

.mapValues是懒惰的,这意味着你每次访问该值时都会执行你给它的函数,因此,当你执行groupedMap(1) += 99时,它运行你的转换,返回你添加99的Set,并丢弃它。

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

如果上述内容似乎不清楚,请尝试将此代码段作为示例运行:

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

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

这是使用可变数据时遇到的许多问题之一。不要这样做。在scala的99%的用例中,不需要它。因此,最好只假装它根本不存在,直到你掌握了足够的语言才能确定剩余的1%。

© www.soinside.com 2019 - 2024. All rights reserved.