1. 概述
Kotlin 提供了许多令人印象深刻的特性,其中之一就是 when()
语句。它在很多方面可以看作是其他语言中传统 switch()
语句的替代和升级版本。
但与传统的 switch
不同,Kotlin 的 when()
更加灵活,支持使用比较运算符(如 <
、<=
、>=
、>
、==
)进行复杂判断,使代码更具可读性和效率。
在本教程中,我们将深入探讨如何结合这些比较运算符使用 when()
语句。
2. 使用 when()
进行比较判断
Kotlin 的 when()
语句可用于高级条件判断。接下来的几个小节中,我们会分别介绍如何使用小于(<
)、小于等于(<=
)、大于等于(>=
)、大于(>
)以及等于(==
)运算符配合 when()
。
⚠️ 使用 when()
语句时,必须保证其覆盖所有可能的情况,即它是“穷尽的”(exhaustive)。当我们处理如 Int
或 String
这类无限制类型时,通常需要使用 else
分支来兜底。
2.1 等于判断(==)
when()
的基本判断是基于等值比较的。也就是说,当我们在 when()
表达式中没有指定任何比较运算符时,Kotlin 默认使用 ==
来进行判断,无需显式写出 ==
。
示例:
fun evaluateFruit(fruit: String): String {
return when (fruit) {
"apple" -> "It's an apple"
"banana" -> "It's a banana"
"orange" -> "It's an orange"
else -> "It's something else"
}
}
测试代码:
@Test
fun testFruit() {
assertEquals("It's an apple", evaluateFruit("apple"))
assertEquals("It's a banana", evaluateFruit("banana"))
assertEquals("It's an orange", evaluateFruit("orange"))
assertEquals("It's something else", evaluateFruit("grape"))
}
这段代码定义了一个 evaluateFruit()
函数,根据传入的水果名称返回相应的描述。如果传入的是 "apple"
,就返回 "It's an apple"
,以此类推。
2.2 小于等于判断(<=)
使用 <=
可以判断某个值是否小于或等于某个阈值:
fun evaluateAge(age: Int): String {
return when {
age <= 0 -> "Invalid age"
age <= 18 -> "Child"
age <= 65 -> "Adult"
else -> "Senior"
}
}
测试代码:
@Test
fun lessThanEqualTest() {
assertEquals("Invalid age", evaluateAge(-5))
assertEquals("Child", evaluateAge(12))
assertEquals("Senior", evaluateAge(70))
}
在这个例子中,evaluateAge()
根据传入的年龄判断是“无效年龄”、“儿童”、“成人”还是“老人”。
2.3 大于等于判断(>=)
使用 >=
可以判断某个值是否大于或等于某个阈值:
fun determineDiscount(price: Double): String {
return when {
price >= 100.0 -> "20% discount"
price >= 50.0 -> "10% discount"
else -> "No discount"
}
}
测试代码:
@Test
fun testDetermineDiscount() {
assertEquals("10% discount", determineDiscount(75.0))
assertEquals("20% discount", determineDiscount(120.0))
assertEquals("No discount", determineDiscount(30.0))
}
该函数根据商品价格判断折扣比例,价格越高,折扣越高。
2.4 大于判断(>)
使用 >
可以判断某个值是否大于某个阈值:
fun evaluateTemperature(temperature: Int): String {
return when {
temperature > 30 -> "Hot"
else -> "Cold"
}
}
测试代码:
@Test
fun testEvaluateTemperature() {
assertEquals("Hot", evaluateTemperature(35))
assertEquals("Cold", evaluateTemperature(0))
}
这个函数根据温度值判断是“热”还是“冷”。
2.5 小于判断(<)
使用 <
可以判断某个值是否小于某个阈值:
fun evaluateScore(score: Int): String {
return when {
score < 50 -> "Fail"
score < 75 -> "Pass"
score < 90 -> "Good"
else -> "Excellent"
}
}
测试代码:
@Test
fun testEvaluateScore() {
assertEquals("Fail", evaluateScore(35))
assertEquals("Pass", evaluateScore(60))
assertEquals("Good", evaluateScore(85))
}
函数根据分数判断成绩等级:不及格、通过、良好、优秀。
3. 使用范围(Range)判断
Kotlin 的 when()
还支持范围判断,这让处理连续区间的条件判断更加简洁。
我们可以通过 in
关键字来判断某个值是否落在某个区间内:
fun evaluateAgeCategory(age: Int): String {
return when (age) {
in 0..5 -> "Infant"
in 6..12 -> "Child"
in 13..19 -> "Teenager"
in 20..64 -> "Adult"
in 65..Int.MAX_VALUE -> "Senior"
else -> "Invalid age"
}
}
测试代码:
@Test
fun testAgeCategories() {
assertEquals("Infant", evaluateAgeCategory(3))
assertEquals("Teenager", evaluateAgeCategory(14))
assertEquals("Adult", evaluateAgeCategory(45))
}
这段代码通过 in
判断年龄属于哪个区间,返回相应的年龄段描述。⚠️ 注意:in 0..5
是闭区间,包含 0 和 5。
4. 使用 when()
进行比较的优势
使用 when()
进行条件判断有以下两个主要优势:
✅ 代码更易读:每个条件分支清晰明了,具有自文档性。
✅ 多条件处理更高效:可以紧凑地处理多个条件,逻辑清晰,结构整洁。
5. 小结
在本文中,我们学习了 Kotlin 中 when()
语句的基本用法,并通过多个示例演示了如何结合 <
、<=
、>=
、>
、==
运算符进行判断。
我们还介绍了如何使用 in
配合范围进行区间判断,使代码更简洁、更具可读性。
完整示例代码可在 GitHub 上找到。