1. 引言
Kotlin 作为现代 JVM 语言,在条件控制方面提供了比 Java 更简洁、更安全的语法。无论是传统的if分支,还是强大的when表达式,Kotlin 都强调「表达式化」——几乎所有控制结构都可以返回值。本文将通过丰富的代码实例,系统讲解 Kotlin 条件控制的核心用法与实战技巧。
2. if 表达式:从语句到表达式
在 Kotlin 中,if不再是单纯的语句,而是一个可以返回值的表达式。这意味着你可以直接把if的结果赋给变量,从而写出更简洁、更函数式的代码。
2.1 传统 if 用法
先看最基础的写法,与 Java 类似:
fun checkNumber(num: Int) { if (num > 0) { println("$num 是正数") } else if (num < 0) { println("$num 是负数") } else { println("$num 是零") } } fun main() { checkNumber(10) checkNumber(-5) checkNumber(0) }2.2 if 作为表达式返回值
Kotlin 的if可以直接返回分支结果,省去临时变量:
fun maxOf(a: Int, b: Int): Int { return if (a > b) a else b } // 更简洁的写法:直接作为表达式体 fun maxOf2(a: Int, b: Int) = if (a > b) a else b fun main() { println(maxOf(3, 7)) // 输出 7 println(maxOf2(9, 2)) // 输出 9 }2.3 if 表达式与字符串模板结合
利用表达式返回值,可以写出非常紧凑的业务逻辑:
fun describe(score: Int): String { return if (score >= 90) { "优秀" } else if (score >= 60) { "及格" } else { "不及格" } } fun main() { val score = 85 println("成绩:$score,等级:${describe(score)}") }3. when 表达式:Kotlin 的 switch 升级版
when是 Kotlin 中最强大的条件控制结构,它取代了 Java 的switch,但功能远超后者。它既可以作为语句,也可以作为表达式返回值,还支持多种匹配模式。
3.1 基础用法:替代 switch
fun getDayName(day: Int): String { return when (day) { 1 -> "星期一" 2 -> "星期二" 3 -> "星期三" 4 -> "星期四" 5 -> "星期五" 6 -> "星期六" 7 -> "星期日" else -> "无效的日期" } } fun main() { println(getDayName(3)) // 输出 星期三 println(getDayName(9)) // 输出 无效的日期 }3.2 多条件合并匹配
多个值可以合并到同一个分支,用逗号分隔:
fun isWeekend(day: Int): Boolean { return when (day) { 1, 2, 3, 4, 5 -> false 6, 7 -> true else -> throw IllegalArgumentException("无效日期:$day") } } fun main() { println(isWeekend(6)) // 输出 true println(isWeekend(3)) // 输出 false }3.3 区间匹配
when可以直接使用区间(Range)进行范围判断:
fun classifyAge(age: Int): String { return when (age) { in 0..12 -> "儿童" in 13..17 -> "青少年" in 18..59 -> "成年人" in 60..150 -> "老年人" else -> "年龄超出合理范围" } } fun main() { println(classifyAge(8)) // 输出 儿童 println(classifyAge(25)) // 输出 成年人 println(classifyAge(70)) // 输出 老年人 }3.4 类型匹配(智能转换)
when可以结合类型检查,自动完成智能转换,这是处理多态对象的利器:
sealed class Shape data class Circle(val radius: Double) : Shape() data class Rectangle(val width: Double, val height: Double) : Shape() data class Triangle(val base: Double, val height: Double) : Shape() fun calculateArea(shape: Shape): Double { return when (shape) { is Circle -> Math.PI * shape.radius * shape.radius is Rectangle -> shape.width * shape.height is Triangle -> 0.5 * shape.base * shape.height } } fun main() { val shapes = listOf( Circle(2.0), Rectangle(3.0, 4.0), Triangle(6.0, 2.0) ) shapes.forEach { println("面积:${calculateArea(it)}") } }3.5 不带参数的 when
当分支条件较复杂时,可以省略when的参数,每个分支写完整的布尔表达式:
fun recommendAction(temp: Double): String { return when { temp < 0 -> "天气寒冷,注意保暖" temp < 15 -> "天气凉爽,建议穿外套" temp < 28 -> "温度适宜,适合户外活动" temp < 35 -> "天气炎热,注意防暑" else -> "高温预警,减少外出" } } fun main() { println(recommendAction(-3.0)) // 天气寒冷,注意保暖 println(recommendAction(22.0)) // 温度适宜,适合户外活动 println(recommendAction(38.0)) // 高温预警,减少外出 }4. 条件控制与集合操作结合
在实际开发中,条件控制经常与集合操作配合使用,实现数据过滤、分组等需求。
4.1 使用 filter 与条件表达式
data class Product(val name: String, val price: Double, val stock: Int) fun main() { val products = listOf( Product("手机", 2999.0, 50), Product("耳机", 399.0, 200), Product("笔记本", 6999.0, 10), Product("鼠标", 99.0, 0) ) // 筛选有库存且价格低于 1000 的商品 val affordable = products.filter { it.stock > 0 && it.price < 1000 } println("可购买且价格低于 1000 的商品:") affordable.forEach { println(" ${it.name} - ¥${it.price}") } }4.2 使用 when 进行分组
fun priceLevel(price: Double): String { return when { price < 100 -> "低价" price < 1000 -> "中价" else -> "高价" } } fun main() { val products = listOf( Product("手机", 2999.0, 50), Product("耳机", 399.0, 200), Product("鼠标", 99.0, 0) ) val grouped = products.groupBy { priceLevel(it.price) } grouped.forEach { (level, items) -> println("$level 商品:${items.joinToString { it.name }}") } }5. 实战案例:模拟登录校验
综合运用if和when,实现一个带输入校验的登录模拟程序:
data class User(val username: String, val password: String) fun validateInput(username: String, password: String): String { return when { username.isBlank() -> "用户名不能为空" password.length < 6 -> "密码长度不能少于 6 位" password.any { it.isDigit() }.not() -> "密码必须包含数字" else -> "输入校验通过" } } fun login(user: User, inputName: String, inputPwd: String): String { val validation = validateInput(inputName, inputPwd) if (validation != "输入校验通过") { return validation } return if (user.username == inputName && user.password == inputPwd) { "登录成功,欢迎 ${user.username}!" } else { "用户名或密码错误" } } fun main() { val admin = User("admin", "abc123") println(login(admin, "admin", "abc123")) // 登录成功 println(login(admin, "admin", "123")) // 密码长度不能少于 6 位 println(login(admin, "admin", "abcdef")) // 密码必须包含数字 println(login(admin, "guest", "abc123")) // 用户名或密码错误 }6. 总结
Kotlin 的条件控制设计充分体现了「简洁、安全、表达力强」的语言哲学:
- if 表达式:可以直接返回值,替代传统三元运算符,代码更直观。
- when 表达式:功能远超 Java 的 switch,支持多值合并、区间匹配、类型匹配和复杂布尔条件。
- 智能转换:结合类型检查,让多态分支处理更加安全优雅。
- 与集合结合:条件控制与函数式集合操作配合,能写出声明式、易维护的业务代码。
建议读者在真实项目中多尝试用when替代冗长的if-else链,并充分利用表达式返回值特性,让代码更加简洁清晰。