1. 概述

Kotlin 提供了许多令人印象深刻的特性,其中之一就是 when() 语句。它在很多方面可以看作是其他语言中传统 switch() 语句的替代和升级版本。

但与传统的 switch 不同,Kotlin 的 when() 更加灵活,支持使用比较运算符(如 <<=>=>==)进行复杂判断,使代码更具可读性和效率

在本教程中,我们将深入探讨如何结合这些比较运算符使用 when() 语句。

2. 使用 when() 进行比较判断

Kotlin 的 when() 语句可用于高级条件判断。接下来的几个小节中,我们会分别介绍如何使用小于(<)、小于等于(<=)、大于等于(>=)、大于(>)以及等于(==)运算符配合 when()

⚠️ 使用 when() 语句时,必须保证其覆盖所有可能的情况,即它是“穷尽的”(exhaustive)。当我们处理如 IntString 这类无限制类型时,通常需要使用 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 上找到。


原始标题:Using Kotlin when() Clause for