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

scala – 惯用的“get or else update”为immutable.Map?

发布时间:2020-12-16 09:32:38 所属栏目:安全 来源:网络整理
导读:对于immutable.Map实例,getOrElseUpdate的惯用方式是什么?我使用下面的代码片段,但它似乎是冗长和低效的 var map = Map[Key,Value]()def foo(key: Key) = { val value = map.getOrElse(key,new Value) map += key - value value} 解决方法 让我总结一下你
对于immutable.Map实例,getOrElseUpdate的惯用方式是什么?我使用下面的代码片段,但它似乎是冗长和低效的

var map = Map[Key,Value]()

def foo(key: Key) = {
  val value = map.getOrElse(key,new Value)
  map += key -> value
  value
}

解决方法

让我总结一下你的问题:

>你想调用一个不可变数据结构的方法
>你希望它返回一些值并重新分配一个var
>因为数据结构是不可变的,所以你需要

>返回一个新的不可变数据结构,或者
>使用提供的关闭在方法内进行分配

所以,你的签名必须看起来像

def getOrElseUpdate(key: K): Tuple2[V,Map[K,V]]
//... use it like
val (v,m2) = getOrElseUpdate(k)
map = m2

要么

def getOrElseUpdate(key: K,setter: (Map[K,V]) => Unit): V
//... use it like
val v = getOrElseUpdate(k,map = _)

如果您可以使用这些解决方案之一,您可以使用隐式转换添加您自己的版本,但是仅通过签名来判断,我不会认为任何这些都在标准库中。

(编辑:李大同)

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

    推荐文章
      热点阅读