Scala原语作为引用类型?

Scala原语作为引用类型?,scala,Scala,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. 我希望我能够使

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.
我希望我能够使用如下包装器类作为映射的值类型(从而存储指向包装器的指针):


…但我想知道我是否缺少一种语言或标准库功能。

Java或Scala中的原语或其非原语计数器部件不能做到这一点。如果您的目标是按键递增映射值,那么除了使用
WrappedInt
之外,没有其他方法,您可以使用一些更好的解决方案来代替WrappedInt

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 }
在我的特殊情况下(使用Spark处理无数记录),我试图避免将哈希查找加倍(get和put各一次)。
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 }