惯用的“获取或更新"对于 immutable.Map? [英] idiomatic "get or else update" for immutable.Map?

查看:22
本文介绍了惯用的“获取或更新"对于 immutable.Map?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

对于 immutable.Map 实例,getOrElseUpdate 的惯用方式是什么?我使用下面的代码段,但它看起来冗长且效率低下

What is the idiomatic way of a getOrElseUpdate for immutable.Map instances?. I use the snippet below, but it seems verbose and inefficient

var map = Map[Key, Value]()

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

推荐答案

让我总结一下您的问题:

Let me summarise your problem:

  • 您想在不可变数据结构上调用方法
  • 您希望它返回一些值重新分配一个var
  • 因为数据结构是不可变的,所以你需要
    • 返回一个新的不可变数据结构,或
    • 使用提供的闭包在方法内部进行赋值

    所以,要么你的签名看起来像

    So, either your signature has to look like

    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 = _)
    

    如果您可以接受这些解决方案中的一个,您可以添加您自己的带有隐式转换的版本,但仅从签名来看,我不认为这些都在标准库中.

    If you can live with one of these solutions, you could add your own version with an implicit conversion but judging by the signatures alone, i wouldn’t think any of these is in the standard library.

    这篇关于惯用的“获取或更新"对于 immutable.Map?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆