如果不存在则将其放入 scala 中的映射

问题描述 投票:0回答:2

我有以下地图:

val m: mutable.Map[String, Long] = mutable.Map()

如果它不存在,我只想为其添加一些值。如果它依次出现,我想执行一些计算:

目前我通过以下方式进行:

val key: String = //...
val value: Long = //...
m(key) = m.getOrElse(key, 0L) + value

但这对我来说感觉有点冗长(在 Java 中我们有

putIfAbsent
方法)。在 Scala 中是否有更短的方法来做到这一点?

scala collections
2个回答
8
投票

您正在寻找

mutable.Map.getOrElseUpdate
:

m.getOrElseUpdate(key, value)

7
投票

对于 可变映射,您可以重写

default
方法,或使用
withDefault
添加默认计算,以便它在第一次访问时自动计算所有缺失值:

val m = new HashMap[String, Int].withDefault(k => 0)

然后您可以像这样更新值:

m("foo") += 5
m("bar") += 7
m("foo") += 37

println(m) // Map(foo -> 42, bar -> 7)

或者只是使用

getOrElseUpdate
:

val m = collection.mutable.HashMap.empty[String, Long]
val k = "the key"

m(k) = m.getOrElseUpdate(k, 0L) + 1
© www.soinside.com 2019 - 2024. All rights reserved.