使用scala中的空ListBuffer映射withDefault

Rus*_*ell 5 scala mutable map

我正在尝试Map使用默认值创建一个mutable ,ListBuffer当请求的元素尚未在地图中时,该默认值会创建一个新的.但是,虽然新地图作为默认值返回,但它不会保留在地图中.也许这就是它的工作方式,我想,但是当我用一个Int而不是ListBuffer它测试它时它完全按照我想要的方式进行测试.这里有一些代码来解释我的意思 - 我做错了什么?

首先,它在这里使用Map[Int]:

scala> val a = collection.mutable.Map(1 -> 1).withDefault(i => 0)
a: scala.collection.mutable.Map[Int,Int] = Map(1 -> 1)

scala> a(1) += 1 // adding to an existing element works as expected

scala> a
res48: scala.collection.mutable.Map[Int,Int] = Map(1 -> 2)

scala> a(2) += 1 // what about adding to a non-existing element?

scala> a // the new element has been added to the map
res50: scala.collection.mutable.Map[Int,Int] = Map(1 -> 2, 2 -> 1)
Run Code Online (Sandbox Code Playgroud)

现在有一个Map[ListBuffer[Int]]:

scala> val b = collection.mutable.Map(1 -> collection.mutable.ListBuffer[Int]()).withDefault(i => collection.mutable.ListBuffer.empty[Int])
b: scala.collection.mutable.Map[Int,scala.collection.mutable.ListBuffer[Int]] = Map(1 -> ListBuffer())

scala> b(1) += 1 // appending to an existing element works as expected
res51: scala.collection.mutable.ListBuffer[Int] = ListBuffer(1)

scala> b
res52: scala.collection.mutable.Map[Int,scala.collection.mutable.ListBuffer[Int]] = Map(1 -> ListBuffer(1))

scala> b(2) += 1 // but appending to a non-existing element...
res53: scala.collection.mutable.ListBuffer[Int] = ListBuffer(1)

scala> b // leaves the map unchanged
res54: scala.collection.mutable.Map[Int,scala.collection.mutable.ListBuffer[Int]] = Map(1 -> ListBuffer(1))
Run Code Online (Sandbox Code Playgroud)

Ale*_*nov 3

区别是这样的:

在第一种情况下a(2)是一个Int. 由于Int没有+=方法,因此a(2) += 1相当于。实际上改变了地图。a(2) = a(2) + 1a.update(2, a(2) + 1)update

ListBuffer[Int] 确实有一个+=方法,所以你的调用是a(2).+=(1),并且你没有设置a(2)任何东西!