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

Kotlin不使用Elvis运算符时,如何正确重写Map单词计数的if分支代码

报错原因说明
  • 首次尝试的代码报错:Kotlin的智能转换仅对局部不可变变量生效,words[input]本质是调用Map的get()方法,编译器无法保证两次调用该方法返回的是同一个值,哪怕前面判断了非空,后续写words[input]+1时,编译器依然认为返回值是可空的Int?,无法直接执行数值加法,触发类型不匹配错误。
  • 按IDE建议加?.plus(1)后仍报错:安全调用形式words[input]?.plus(1)的返回值是可空类型Int?,和else分支的非空数值组合后,整个if表达式的类型是Int?,但words是MutableMap<String, Int>,要求value为非空Int,可空类型无法直接赋值,因此继续报错。

注意:你之前自行重写时else分支写0的逻辑和原Elvis代码的实际逻辑不匹配,原Elvis表达式(wordCounts[input] ?: 0) + 1在key不存在时,最终赋值为1(即空值取0后再加1),而非0。

符合要求的正确实现

不使用Elvis运算符,仅保留if判断的前提下,只要把Map的取值结果存入局部不可变变量,让编译器可以完成智能转换即可,代码逻辑和原Elvis版本完全一致:

val words = mutableMapOf<String, Int>()
val input = scan.next()
// 先将当前key对应的取值存入局部不可变变量,支持智能转换
val currentCount = words[input]
words[input] = if (currentCount != null) {
    currentCount + 1
} else {
    1
}

这样写的特性:

  • 全程没有使用Elvis运算符,完全依赖if分支判断空值场景
  • 所有操作符合Kotlin空安全规则,不会触发类型匹配报错
  • 计数逻辑和原Elvis版本完全对齐

内容的提问来源于stack exchange,提问作者yras8

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.23 23:15:04