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
相关产品推荐
相关产品推荐

