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,但更简洁且支持链式判断。


三、循环与迭代:forwhile

除了条件分支,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 whiledo-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 表达式,或用惰性求值优化条件判断,逐步提升代码质量。记住,条件控制不仅是技术问题,更是逻辑思维的体现——就像交通灯的设计,既要清晰明确,也要灵活适应各种场景。

最新发布