如果缺少,则将其放入scala中映射
我有以下地图:如果缺少,则将其放入scala中映射,scala,collections,Scala,Collections,我有以下地图: val m: mutable.Map[String, Long] = mutable.Map() 如果它不存在,我想给它一些价值。如果它依次出现,我想进行一些计算: 目前,我的做法如下: val key: String = //... val value: Long = //... m(key) = m.getOrElse(key, 0L) + value 但我觉得这有点冗长(在Java中,我们有putIfAbsent方法)。在Scala中是否有一种较短的方法可以做到这一点?
val m: mutable.Map[String, Long] = mutable.Map()
如果它不存在,我想给它一些价值。如果它依次出现,我想进行一些计算:
目前,我的做法如下:
val key: String = //...
val value: Long = //...
m(key) = m.getOrElse(key, 0L) + value
但我觉得这有点冗长(在Java中,我们有putIfAbsent
方法)。在Scala中是否有一种较短的方法可以做到这一点?您正在寻找:
例如,您可以覆盖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)
虽然这确实是一个非常方便的方法,但我不认为它在这个特定的用例中会有什么帮助。它会不会让赋值正好长6个字符,并且每个键都需要一个额外的
put(0)
一次?只是尝试了一下,结果没有达到我的预期效果。我期望键->50L
,但键->20L
是。所以没有类似于putIfAbsent
的东西……默认的类似于自动触发的putIfAbsent
。每次访问一个新密钥时都会自动调用它。@St.Antario如果您确实希望完全使用putIfAbsent
的功能,您确实可以使用getOrElseUpdate
,然后忽略返回的值。因此,在某种程度上,Yuval Itzhakov从字面上回答了括号中关于Java方法类比的部分问题。我只是不明白它应该如何帮助你解决如何缩短“获取和更新”的实际问题。如果使用getOrElseUpdate
而不是getOrElse
,则代码会变得更长,性能也会稍差(因为还有一次写入)。它不是Java。写什么在Scala中工作。仍然不明白GetOrelsUpdate
如何帮助。。。它设置新值而不考虑前一个值@圣安塔里奥:使用defaultvalue
在这种情况下也会更快。Java中没有类比,因为命令“立即执行”putDefaultValueToAllAbsentKeys
必须为无限多个键设置一个0
,这显然无法工作。问题的标题和内容指向一个典型的XY问题。当你试图解决实际问题时,你发现你不需要你在标题中要求的东西。。。因此,也许您应该将标题更新为“如果映射(Scala)中缺少值,则更新默认值”,或者类似的内容。
m("foo") += 5
m("bar") += 7
m("foo") += 37
println(m) // Map(foo -> 42, bar -> 7)