使用Scala中的默认值更新可变映射

fra*_*den 4 scala map

请考虑以下代码,该代码计算列表中每个字符串的频率,并将结果存储在可变映射中.这很好用,但我不明白+ =方法的定义在哪里?!这是一些奇怪的隐式转换事物还是什么?我在某处看到了这段代码,但它没有包含对+ =的解释.

val list = List("a", "b", "a")
val counts = new scala.collection.mutable.HashMap[String, Int]().withDefaultValue(0)
list.foreach(counts(_) += 1)
counts
//> res7: scala.collection.mutable.Map[String,Int] = Map(a -> 2, b -> 1)
Run Code Online (Sandbox Code Playgroud)

map的apply会返回一个Int,但是Int没有+ =并且这个方法用一个新值更新map,所以看起来apply会返回一个带有+ =方法的可变整数...

axe*_*l22 8

这不是一种隐含的转换 - 它是一种贬义.写作:

x += 1
Run Code Online (Sandbox Code Playgroud)

desugars:

x = x + 1
Run Code Online (Sandbox Code Playgroud)

如果类x没有+=定义方法.

以同样的方式:

counts("a") += 1
Run Code Online (Sandbox Code Playgroud)

desugars:

counts("a") = counts("a") + 1
Run Code Online (Sandbox Code Playgroud)

因为counts("a")Int,并且Int没有+=定义方法.

另一方面,写作:

x(expression1) = expression2
Run Code Online (Sandbox Code Playgroud)

update在Scala中调用方法的方法是:

x.update(expression1, expression2)
Run Code Online (Sandbox Code Playgroud)

每个mutable Map都有一个定义update方法- 它允许在地图中设置键.

因此,整个表达方式都是:

list.foreach(x => counts.update(x, counts(x) + 1))
Run Code Online (Sandbox Code Playgroud)

+=不要与Scala中s 的+=方法混淆mutable.Map.如果该密钥已存在,则该方法更新映射中的条目,或者添加新的键值对.它返回this引用,即相同的映射,因此您可以链接+=调用.请参阅ScalaDoc源代码.