刚才我惊讶地发现mapValues
产生了一个 View 。结果显示在以下示例中:
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
会生成view
,因此,每当使用_ + 0.1 * rand.nextGaussian
时,总是会重新评估perturbed
。我现在正在执行类似
distribution map { case (s, p) => (s, p + 0.1 * rand.nextGaussian) }
的操作,但这只是有些冗长。因此,此问题的目的是:mapValues
输出view
的原因。 Map
的替代方法。 谢谢。
最佳答案
有一张票,SI-4776(由YT发行)。
引入它的提交有这样的说法:
我无法找到jrudolph的原始建议,但我认为这样做是为了使mapValues
更有效。提出一个问题,这可能令人惊讶,但是如果您不太可能多次迭代这些值,则mapValues
会更有效。
解决方法是,可以执行mapValues(...).view.force
来生成新的Map
。
关于scala - Scala:为什么mapValues会生成 View ,并且有任何稳定的替代方法?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14882642/