Kotlin 条件控制(千字长文)
💡一则或许对你有用的小广告
欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论
- 新项目:《从零手撸:仿小红书(微服务架构)》 正在持续爆肝中,基于
Spring Cloud Alibaba + Spring Boot 3.x + JDK 17...
,点击查看项目介绍 ;- 《从零手撸:前后端分离博客项目(全栈开发)》 2 期已完结,演示链接: http://116.62.199.48/ ;
截止目前, 星球 内专栏累计输出 82w+ 字,讲解图 3441+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 2900+ 小伙伴加入学习 ,欢迎点击围观
在编程的世界中,条件控制就像交通灯一样,决定了程序执行的“行驶方向”。无论是判断用户输入是否合法,还是根据数据状态动态调整流程,Kotlin 条件控制都是构建灵活逻辑的核心工具。本文将通过实际案例和代码示例,从基础到进阶,逐步解析 Kotlin 中的条件控制机制,帮助开发者掌握如何用优雅的方式实现复杂逻辑判断。
一、条件控制的基础:if - else
表达式
在 Kotlin 中,if
是最基础的条件控制结构,它允许程序根据布尔表达式的值选择执行不同的代码块。与 Java 不同的是,Kotlin 的 if
可以直接作为表达式返回值,这使得代码更加简洁。
1.1 基本语法与代码块结构
val score = 85
val result = if (score >= 60) {
"及格"
} else {
"不及格"
}
println(result) // 输出 "及格"
在这个例子中,if
表达式通过判断 score
是否大于等于 60,返回对应的字符串。注意,当 if
后跟代码块({}
)时,必须明确指定返回值类型,如 result
的类型是 String
。
1.2 单行简写与分支嵌套
当条件分支逻辑简单时,可以省略代码块,直接返回表达式值:
val isWeekend = false
val message = if (isWeekend) "周末愉快!" else "工作日加油!"
对于多层条件判断,可以通过嵌套 if - else
实现:
val temperature = 28
val weatherAdvice = if (temperature > 30) {
"注意防暑降温!"
} else if (temperature > 20) {
"适合户外活动。"
} else {
"记得添加衣物。"
}
二、超越 switch
:Kotlin 的 when
表达式
Kotlin 的 when
表达式是对 Java switch
的升级,它不仅支持枚举类型、字符串、范围匹配,还能直接处理条件逻辑,甚至替代复杂的 if - else
嵌套。
2.1 基本用法与多条件匹配
when
可以直接匹配变量或表达式,并支持多种条件:
val day = "Monday"
val dayType = when (day) {
"Saturday", "Sunday" -> "周末"
"Monday" -> "工作日开始"
else -> "普通工作日"
}
println(dayType) // 输出 "工作日开始"
这里通过逗号分隔多个匹配条件(如周六和周日),使用 ->
分隔条件与执行逻辑,语法简洁直观。
2.2 范围与类型安全匹配
when
还能结合 in
关键字匹配范围,或通过类型判断动态执行代码:
// 范围匹配
val age = 25
when (age) {
in 0..12 -> "儿童"
in 13..18 -> "青少年"
in 19..60 -> "成年人"
else -> "老年"
}
// 类型匹配
fun printDetails(obj: Any) {
when (obj) {
is String -> println("字符串长度:${obj.length}")
is Int -> println("数值的平方:${obj * obj}")
else -> println("未知类型")
}
}
在第二个例子中,when
根据 obj
的实际类型调用不同的逻辑,这类似于 Java 的 instanceof
,但更简洁且支持链式判断。
三、循环与迭代:for
和 while
除了条件分支,Kotlin 还提供了多种循环结构来重复执行代码,常用于遍历集合或实现算法。
3.1 for
循环:遍历集合与区间
Kotlin 的 for
循环通过 in
关键字遍历集合或区间,无需显式使用索引:
// 遍历列表
val fruits = listOf("苹果", "香蕉", "橙子")
for (fruit in fruits) {
println("我喜欢 $fruit")
}
// 遍历区间
for (i in 1..5) {
print(i) // 输出 "12345"
}
若需获取索引,可以使用 withIndex()
扩展函数:
for ((index, fruit) in fruits.withIndex()) {
println("第 $index 个水果是 $fruit")
}
3.2 while
与 do-while
:条件驱动的循环
while
在循环体执行前判断条件,而 do-while
则保证至少执行一次:
var count = 0
while (count < 3) {
print(count) // 输出 "012"
count++
}
do {
print("执行了一次")
} while (false) // 仍会执行一次
四、进阶技巧:惰性求值与条件表达式组合
4.1 惰性求值与短路逻辑
Kotlin 的 &&
和 ||
运算符支持惰性求值,即当第一个条件已确定结果时,后续表达式不再执行。这可以避免空指针或越界访问:
val list = emptyList<String>()
if (list.isNotEmpty() && list[0] == "安全") {
// 只有当列表非空时,才会访问 list[0]
}
4.2 条件表达式与函数结合
条件表达式可以嵌入函数参数或返回值中,增强代码灵活性:
fun calculateDiscount(price: Int, isVip: Boolean): Int {
return if (isVip) price * 0.8.toInt() else price
}
五、最佳实践与常见陷阱
5.1 避免深嵌套:优先使用 when
或函数拆分
深嵌套的 if - else
会导致代码难以维护,建议用 when
或将逻辑封装为独立函数:
// 不良写法
if (condition1) {
if (condition2) {
// ...
}
}
// 优化后
when {
condition1 && condition2 -> { /* ... */ }
}
5.2 注意 else
的遗漏
在 when
中,若没有 else
分支且无法穷举所有可能值,编译器会报错,强制开发者处理所有情况:
enum class Status { ACTIVE, INACTIVE, PENDING }
fun getStatusMessage(status: Status): String {
return when (status) {
Status.ACTIVE -> "已激活"
Status.INACTIVE -> "未激活"
// 必须添加 Status.PENDING 的处理
}
}
结论
通过本文的讲解,我们掌握了 Kotlin 条件控制 的核心机制,从 if - else
的基础语法到 when
的强大功能,再到循环结构与进阶技巧,这些工具共同构成了程序逻辑的“导航系统”。无论是判断用户输入、遍历数据集,还是实现复杂的业务规则,开发者都可以通过合理组合条件控制语句,写出简洁、可读性强且高效的代码。
实践建议:尝试将现有代码中的多重 if - else
改写为 when
表达式,或用惰性求值优化条件判断,逐步提升代码质量。记住,条件控制不仅是技术问题,更是逻辑思维的体现——就像交通灯的设计,既要清晰明确,也要灵活适应各种场景。