Сейчас я с удивлением узнаю, что mapValues
создает вид. Последствие показано в следующем примере:Scala: Почему 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
, _ + 0.1 * rand.nextGaussian
всегда переоценивается всякий раз, когда используется perturbed
.
Теперь я делаю что-то вроде distribution map { case (s, p) => (s, p + 0.1 * rand.nextGaussian) }
, но это всего лишь немного подробный. Таким образом, цель этого вопроса:
- Напомните людям, которые не знают об этом факте.
- Ищите причины, по которым они делают
mapValues
view
s. - Существует ли альтернативный метод, который дает бетон
Map
. - Есть ли другие широко используемые методы сбора, которые имеют эту ловушку.
Спасибо.
OMG есть другое место, в котором я использую 'mapValues', поэтому он так медленно работает ... – Kane
Я тоже был укушен. – ziggystar
Сегодня я тоже вступил в эту ловушку. –