使用Scala中的默认值更新可变映射
发布时间:2020-12-16 18:22:17 所属栏目:安全 来源:网络整理
导读:请考虑以下代码,该代码计算列表中每个字符串的频率,并将结果存储在可变映射中.这很好用,但我不明白=方法的定义在哪里?!这是一些奇怪的隐式转换事物还是什么?我在某处看到了这段代码,但它没有包含对=的解释. val list = List("a","b","a")val counts = new
请考虑以下代码,该代码计算列表中每个字符串的频率,并将结果存储在可变映射中.这很好用,但我不明白=方法的定义在哪里?!这是一些奇怪的隐式转换事物还是什么?我在某处看到了这段代码,但它没有包含对=的解释.
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) map的apply会返回一个Int,但Int没有=并且这个方法用一个新值更新map,所以看起来apply会返回一个带有=方法的可变整数… 解决方法
这不是一种隐含的转换 – 它是一种贬义.
写作: x += 1 desugars: x = x + 1 如果x的类没有定义=方法. 以同样的方式: counts("a") += 1 desugars: counts("a") = counts("a") + 1 因为count(“a”)是一个Int,而Int没有定义=方法. 另一方面,写作: x(expression1) = expression2 在Scala中调用update方法的问题: x.update(expression1,expression2) 每个可变Map都有一个更新方法defined – 它允许在地图中设置键. 因此,整个表达方式都是: list.foreach(x => counts.update(x,counts(x) + 1)) 这个=不要与Scala中的mutable.Maps上的=方法混淆.如果该密钥已存在,则该方法更新映射中的条目,或者添加新的键值对.它返回此引用,即相同的映射,因此您可以链式=调用.见ScalaDoc或source code. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |