【发布时间】:2019-11-11 23:45:25
【问题描述】:
刚刚得知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 产生了view,所以每当使用perturbed 时,总是会重新评估_ + 0.1 * rand.nextGaussian。
我现在正在做类似distribution map { case (s, p) => (s, p + 0.1 * rand.nextGaussian) } 的事情,但这有点冗长。所以这个问题的目的是:
- 提醒不知道这一事实的人。
- 找出他们让
mapValues输出views 的原因。 - 是否有替代方法可以产生混凝土
Map。 - 有没有其他常用的收集方法有这个陷阱。
谢谢。
【问题讨论】:
-
天哪,我在另一个地方使用
mapValues,这就是它有时运行如此缓慢的原因...... -
我也被这个咬过。
-
今天我也中了这个陷阱。
-
今天刚被这个咬了!
-
我知道这种行为,但我仍然陷入了这个陷阱,更糟糕的是,调试起来非常痛苦。