在Kotlin中无法使用?:(Elvis)运算符,请问其使用方法与适用场景是什么
Kotlin
?: Elvis 运算符用法详解 基础定义与语法
?: 是Kotlin为空安全场景设计的专用运算符,核心作用是为可能为空的表达式提供兜底值,语法规则如下:
<左侧可能为空的表达式> ?: <左侧为空时的兜底表达式>
执行逻辑:
- 首先计算左侧表达式的返回值
- 若左侧返回值非空,整个运算的结果为左侧表达式的返回值
- 若左侧返回值为空,整个运算的结果为右侧兜底表达式的返回值
典型适用场景
1. 变量空值默认赋值
最常用的场景是替代if(null == x)的分支判断,简化空值兜底赋值逻辑:
// 模拟可能返回空的查询方法 fun getUserNameFromDB(userId: Int): String? { return if (userId == 1) "ZhangSan" else null } // 不用Elvis运算符的写法 val name1 = getUserNameFromDB(2) val displayName1 = if (name1 != null) name1 else "游客" // 等价的Elvis写法 val displayName2 = getUserNameFromDB(2) ?: "游客"
2. 空值场景提前终止流程
右侧可以搭配return、throw等控制流语句,快速实现参数校验、异常抛出、提前返回等逻辑,无需额外分支判断:
// 空值时直接抛出异常 fun queryUser(userId: String?): User { val validId = userId ?: throw IllegalArgumentException("用户ID不能为null") return userDao.query(validId) } // 空值时直接结束函数 fun updateAvatar(avatarUrl: String?) { val validUrl = avatarUrl ?: return // 后续逻辑仅在url非空时执行 user.avatar = validUrl saveUserInfo() }
3. 结合安全调用符简化链式空判断
和安全调用符?.搭配,可以大幅简化多层嵌套属性的空安全处理:
// 不用Elvis的写法 val city1 = if (user?.address?.province?.city != null) user.address.province.city else "未知城市" // 结合Elvis的简化写法 val city2 = user?.address?.province?.city ?: "未知城市"
注意事项
- 右侧表达式仅在左侧为空时才会执行,若右侧包含打印、变量修改等带副作用的操作,需要注意触发时机
- 运算符优先级高于
&&、||等逻辑运算符,复杂表达式场景建议添加括号明确优先级,避免出现逻辑错误 - 不要和安全调用符
?.的逻辑混淆:?.仅在左侧非空时执行后续调用,结果仍可能为空;?:最终返回值必然非空(只要兜底表达式非空)
内容的提问来源于stack exchange,提问作者user16681535
相关产品推荐
相关产品推荐

