Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如果缺少,则将其放入scala中映射_Scala_Collections - Fatal编程技术网

如果缺少,则将其放入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)