You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 23:42:04