Scala immutable.Map.apply每次调用时都会重新计算

Scala immutable.Map.apply每次调用时都会重新计算,scala,Scala,我被映射搞糊涂了。应用API。您可以在下面的4行代码中轻松地重现该问题 case class Product(id: Int, tags: Set[String]) val productList = List(Product(0, Set("a")), Product(1, Set("a", "b"))) // Create a dict mapping from a tag to a list of product val tagDict = productList.flatMap(p =&

我被
映射搞糊涂了。应用
API。您可以在下面的4行代码中轻松地重现该问题

case class Product(id: Int, tags: Set[String])
val productList = List(Product(0, Set("a")), Product(1, Set("a", "b")))
// Create a dict mapping from a tag to a list of product
val tagDict = productList.flatMap(p => p.tags.map(_ -> p)).groupBy(_._1).mapValues(_.map(_._2))
println(tagDict("a") eq tagDict("a"))
似乎每次
tagDict(“a”)
都会给我一个不同的对象。 依我看,一旦建立了地图,键
a
的值应该是固定的。
谢谢。

这是因为
mapValues
创建代理
MappedValues
实现
get
方法,该方法应用您的函数
.map(\u2)
每次调用
apply
时,依次调用
get
。您可以在
tagDict
生成器行末尾添加
.toList.toMap
,这将解决问题,但这只是一个快速修复程序,只需添加
.view.force