刚才我很惊讶地得知这mapValues
会产生一个视图。结果如下例所示:
case class thing(id: Int)
val rand = new java.util.Random
val distribution = Map(thing(0) -> 0.5, thing(1) -> 0.5)
val perturbed = distribution mapValues { _ + 0.1 * rand.nextGaussian }
val sumProbs = perturbed.map{_._2}.sum
val newDistribution = perturbed mapValues { _ / sumProbs }
这个想法是我有一个分布,它受到一些随机性的干扰,然后我重新规范化它。代码实际上在其初衷中失败了:因为mapValues
产生 a view
,_ + 0.1 * rand.nextGaussian
总是在使用时重新评估perturbed
。
我现在正在做类似distribution map { case (s, p) => (s, p + 0.1 * rand.nextGaussian) }
的事情,但这有点冗长。所以这个问题的目的是:
- 提醒不知道这一事实的人。
- 寻找他们制作
mapValues
outputview
的原因。 - 是否有生产混凝土的替代方法
Map
。 - 有没有其他常用的收集方法有这个陷阱。
谢谢。