刚才我惊讶地发现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/

    10-10 08:37