为什么当我重新访问MapValues的结果时,它会改变吗?它不应该是不可变的。
考虑以下菊石会议。
stephen@ import scala.util.Random
import scala.util.Random
stephen@ Seq("a").map(_ => Random.nextInt)
res1: Seq[Int] = List(1035918980)
stephen@ res1
res2: Seq[Int] = List(1035918980)
// re accessing Seq.map doesnt change
stephen@ Map("a" -> "a").mapValues(_ => Random.nextInt())
res3: Map[String, Int] = Map("a" -> 653125272)
stephen@ res3
res4: Map[String, Int] = Map("a" -> -694232910)
// re accessing Map.mapValues changes
根据 Scaladoc 的说法,mapValues
返回一个包装原始集合的视图,而不是复制(转换后的(数据。由于这只是一个视图,而不是其本身的集合,因此每次访问它时都需要重新评估它。
这与map
不同,在中,scaladoc 提到返回一个新集合,而不仅仅是引用原始集合的视图。
mapValues
返回地图的视图。每次访问时都会应用值转换,而不是保留在内存中。