折叠可变.映射和可变.使用 Set.add 时,Set 不起作用



我只是想知道为什么我的值分组在下面的代码中不起作用。从技术上讲,Map 和 Set 都是可变的,所以我的 add(intValue( 应该更改集合(并间接更改聚合器映射(。

import scala.collection.mutable._
val original = Iterator[(String, Int)](
  "one" -> 1,
  "two" -> 20,
  "three" -> 30,
  "one" -> 11
)
val folded = original.foldLeft(
  Map[String, Set[Int]]().withDefaultValue(Set.empty))
{
  case (agg, (strVal, intVal)) =>
    //agg += ((strVal, agg(strVal) + intVal))  <-- option 1  works
    agg(strVal).add(intVal)  // <--- option 2 does not work
    agg                      // <--- option 2 does not work   
}

对于选项 1,结果符合预期("一"分组 -> Set(1, 11( ...对于选项 2,我得到一个空地图。

.withDefaultValue 不会将值添加到 Map 。请改用.getOrElseUpdate(strVal, Set.empty).add(intVal)

当您使用此默认值在此映射上调用 get(key( 时,它永远不会添加您传递的键,从外观上看,它会在映射中所有默认值的"null 键"行上添加另一个键,这就是为什么每次执行 get 时都会得到相同的 Set, 但它不是您正在寻找的价值。

最新更新