Scala是否提供了一种通过引用(例如,在堆上)开箱即用来访问基元的方法?例如,是否有一种惯用的方法使下面的代码返回1?:
import scala.collection.mutable
val m = new mutable.HashMap[String, Int]
var x = m.getOrElseUpdate("foo", 0)
x += 1
m.get("foo") // The map value should be 1 after the preceding update.
我希望我能够使用类似下面的包装类作为地图的值类型(从而存储指向WrappedInts的指针):
class WrappedInt(var theInt:Int)
...但我想知道我是否缺少语言或标准库功能。
答案 0 :(得分:1)
你不能用基元或它们的非基元来对付Java和Scala中的部分。看不到任何其他方式,只能使用WrappedInt
。
答案 1 :(得分:0)
如果您的目标是按键增加地图值,那么您可以使用一些更好的解决方案而不是包装器。
val key = "foo"
val v = m.put(key, m.getOrElse(key, 0) + 1)
或其他方法是为地图设置默认值0
:
val m2 = m.withDefault(_ => 0)
val v = m2.put(key, m2(key) + 1)
或添加扩展方法updatedWith
implicit class MapExtensions[K, V](val map: Map[K, V]) extends AnyVal {
def updatedWith(key: K, default: V)(f: V => V) = {
map.put(key, f(map.getOrElse(key, default)))
}
}
val m3 = m.updatedWith("foo", 0) { _ + 1 }