加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

使用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.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读