【问题标题】:putIfAbsent for immutable maps?putIfAbsent 用于不可变映射?
【发布时间】:2014-06-27 08:34:47
【问题描述】:

我经常发现自己在编写这样的代码:

import scala.collection.immutable._

var foos = Map.empty[Int, Foo]

def fooOf(n: Int): Foo = {
  foos.get(n) match {
    case Some(foo) => foo
    case None =>
      val foo = new Foo(n)
      foos = foos.updated(n, foo)
      foo
  }
}

使用并发映射,代码看起来更漂亮:

import scala.collection.concurrent._

var foos = TrieMap.empty[Int, Foo]

def fooOf(n: Int): Foo = {
  val foo = new Foo(n)
  foos.putIfAbsent(n, foo) getOrElse foo
}

但我真的想要一个非并发、不可变的映射。有类似putIfAbsent 的东西吗?

(顺便说一句,在并发示例中,是否只有在确实不存在时才能创建Foo?)

【问题讨论】:

    标签: scala collections map concurrency immutability


    【解决方案1】:

    如果您对可变变量没问题(并且您在两个示例中都使用var foos 并且只指定了一个不可变集合),这应该符合您的需求:

    var foos = Map.empty[Int, Foo]
    
    def fooOf(n: Int): Foo = {
      foos.getOrElse(n, {
        foos = foos.updated(n, new Foo(n))
        foos(n)
      })
    }
    

    【讨论】:

    • 你只需一个电话就可以做 foos.getOrElse(n, { /* not found, do something else */ })。
    • 感谢@DCKing - 刚刚编辑了使用地图的 getOrElse 的答案
    • 这不是一个好主意,它有副作用,对并发无效。
    猜你喜欢
    • 1970-01-01
    • 2017-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-09
    相关资源
    最近更新 更多