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