kotlin中 ?:的用法

在Kotlin中,?:操作符被称为Elvis操作符,它用于处理可空类型的值,提供一种简洁的方式来指定当左侧表达式为null时的默认值。

Elvis操作符的基本语法和执行逻辑是: 表达式 A ?: B 的执行逻辑如下:如果表达式 A 的值不为 null,则整个表达式的值就是 A;如果 Anull,则返回 B 的值。右侧表达式 B 仅在左侧为 null 时才会求值,这类似于短路求值。例如:

kotlin 复制代码
var age: String? = null
val result = age?.toInt() ?: 0 // 如果 age 为 null,result 为 0
println(result) // 输出 0

它常与安全调用符(?.)结合使用,以避免NullPointerException,并提供默认值。常见场景包括:

  • 变量空安全赋值:例如 val username = user?.name ?: "Guest",当 useruser.namenull 时返回 "Guest"
  • 函数返回值处理:例如 fun getTextLength(text: String?): Int { return text?.length ?: 0 },确保返回非负整数。
  • 链式调用保护:例如 val city = order?.customer?.address?.city ?: "Unknown City",防止属性访问链中的 null
  • 配合异常抛出:例如 val address = person.company?.address ?: throw IllegalArgumentException("No Address"),在缺少数据时抛出有意义的异常。

与相关操作符对比: Elvis操作符与安全调用符(?.)和非空断言(!!)有明显区别:

  • ?.:安全调用,如果左侧为 null 则返回 null,不继续执行。
  • ?::空合并,提供默认值替代 null
  • !!:强制解包,如果左侧为 null 则抛出 NullPointerException

进阶技巧和注意事项包括: 右侧表达式可以是任何合法表达式,包括函数调用或复杂逻辑,且支持延迟计算。例如:

kotlin 复制代码
val data = cache.get(key) ?: { println("缓存未命中"); database.query(key) }()

类型推断方面,编译器会自动推断两侧类型的共同父类型。例如 val num: Number = intValue ?: 0.0 中,NumberIntDouble 的共同父类型。使用时需注意避免在右侧表达式中引入不必要的副作用,并合理使用括号处理优先级问题。

相关推荐
Highcharts.js2 小时前
缺失数据可视化图表开发实战|Highcharts创建人员出生统计面积图表示例
开发语言·前端·javascript·信息可视化·highcharts·图表开发
测试员周周6 小时前
【Appium 系列】第16节-WebView-H5上下文切换 — 混合应用的自动化难点
运维·开发语言·人工智能·功能测试·appium·自动化·测试用例
杜子不疼.9 小时前
【C++ AI 大模型接入 SDK】 - DeepSeek 模型接入(上)
开发语言·c++·chatgpt
加号39 小时前
【C#】 串口通信技术深度解析及实现
开发语言·c#
晓梦林9 小时前
cp520靶场学习笔记
android·笔记·学习
sycmancia9 小时前
Qt——编辑交互功能的实现
开发语言·qt
石山代码10 小时前
C++ 内存分区 堆区
java·开发语言·c++
无风听海10 小时前
C# 隐式转换深度解析
java·开发语言·c#
一只大袋鼠11 小时前
Git 进阶(二):分支管理、暂存栈、远程仓库与多人协作
java·开发语言·git
LuminousCPP11 小时前
数据结构 - 线性表第四篇:C 语言通讯录优化升级全记录(踩坑 + 思考)
c语言·开发语言·数据结构·经验分享·笔记·学习