为什么Map.mapValues会改变答案

时间:2017-07-19 07:27:30

标签: scala

为什么当我访问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

2 个答案:

答案 0 :(得分:1)

mapValues会返回地图的视图。每次访问时都应用值转换,而不是在内存中保留。

答案 1 :(得分:1)

根据the ScaladocmapValues返回包装原始集合的视图,而不是复制(转换的)数据。由于这只是一个视图,而不是一个集合本身,因此每次访问时都需要重新评估它。

这与map不同,其中the scaladoc提及返回新集合而不仅仅是引用原始集合的视图。