如何在Scala中使用getOrElseUpdate实现Map内Int值的自增操作
报错根因
- Scala 中针对
Int等原生数值类型的+=不是类成员方法,是语法糖:只有操作符左侧是可赋值的「左值」时才会被合法展开- 你写
map(5) += 1时,编译器会自动展开为map.update(5, map.apply(5) + 1),这是mutable.Map原生支持的语法 - 而
map.getOrElseUpdate(5, 0)返回的是一个具体的Int值,不是可赋值的左值,编译器无法把这个表达式展开为合法的赋值操作,因此报+=不是Int的成员错误
- 你写
- 之前用
ArrayBuffer没问题,是因为ArrayBuffer的+=是它自身实现的成员方法,你调用getOrElseUpdate拿到ArrayBuffer实例后,直接调用它的+=方法修改实例本身,完全符合语法规则
解决办法
方案1:普通写法实现需求(无需修改值类型,最常用)
你要实现「key不存在就初始为0再加1,存在就直接加1」的逻辑,一行即可实现:
map(5) = map.getOrElse(5, 0) + 1
如果默认值是复杂计算逻辑、想要避免重复计算,可以拆分写法:
val initVal = map.getOrElseUpdate(5, 0) map(5) = initVal + 1
方案2:使用可变数值类型(符合你提到的mutable.Int思路)
如果你想要和ArrayBuffer一样直接对getOrElseUpdate的返回值调用+=,可以把Map的值类型换成Scala标准库的可变数值类型:
import scala.collection.mutable val map = mutable.Map[Int, mutable.Int]() // 插入/更新操作 map.getOrElseUpdate(5, mutable.Int(0)) += 1 // 取值时获取包装的原始Int即可 println(map(5).value) // 输出1
内容的提问来源于stack exchange,提问作者electrickster
相关产品推荐
相关产品推荐

