Kotlin when 关键字
最后修改于 2025 年 4 月 19 日
Kotlin 的 when
关键字是一个强大的条件表达式,它取代了 Java 的 switch 语句。它比传统的 switch 语句提供了更多的灵活性和功能。本教程通过实际例子深入探讨了 when
关键字。
基本定义
Kotlin 中的 when
关键字既可以作为语句,也可以作为表达式。它可以简洁地检查多个条件,并支持各种匹配模式。与 Java 的 switch 不同,它适用于任何数据类型。
基本的 when 表达式
when
最简单的形式是将一个值与几个常量进行匹配。它类似于 switch 语句,但更强大。每个分支按顺序检查,直到找到匹配项。
package com.zetcode fun main() { val x = 2 when (x) { 1 -> println("x is 1") 2 -> println("x is 2") 3 -> println("x is 3") else -> println("x is neither 1, 2, nor 3") } }
此示例显示了一个基本的 when
表达式,用于匹配整数值。输出将是 "x is 2",因为这是匹配的情况。else 分支处理所有其他可能性。
when 作为表达式
when
可以用作返回值的表达式。在这种形式中,除非编译器可以证明涵盖了所有情况,否则需要 else 分支。每个分支返回一个值。
package com.zetcode fun main() { val x = 3 val result = when (x) { 1 -> "One" 2 -> "Two" 3 -> "Three" else -> "Unknown" } println(result) // Output: Three }
在这里,when
用作返回字符串的表达式。该值被分配给 result
,然后被打印出来。这比使用 if-else 链来实现相同的目的更简洁。
一个分支中的多个条件
when
允许使用逗号在一个分支中组合多个条件。当多个值应该执行相同的代码块时,这使得代码更简洁。它比重复相同的代码更清晰。
package com.zetcode fun main() { val x = 5 when (x) { 1, 3, 5 -> println("x is odd and between 1-5") 2, 4, 6 -> println("x is even and between 2-6") else -> println("x is outside 1-6 range") } }
此示例将奇数和偶数分组到不同的分支中。输出将指示 5 是一个介于 1-5 之间的奇数。这种方法减少了代码重复。
when 中的范围检查
when
可以使用 in
运算符检查一个值是否在范围内。这比只适用于常量值的传统 switch 语句更强大。范围使代码更具表达力。
package com.zetcode fun main() { val score = 85 val grade = when (score) { in 90..100 -> "A" in 80..89 -> "B" in 70..79 -> "C" in 60..69 -> "D" else -> "F" } println("Grade: $grade") // Output: Grade: B }
此示例根据分数范围分配字母等级。in
运算符检查分数是否落在每个范围内。输出显示了对于 85 分的 B 等级。
when 的类型检查
when
可以使用 is
运算符检查对象的类型。这与智能类型转换结合使用,以访问特定于类型的属性。这是 Java 中 instanceof 检查的强大替代方案。
package com.zetcode fun describe(obj: Any): String = when (obj) { is String -> "String with length ${obj.length}" is Int -> "Integer with value $obj" is Double -> "Double with value $obj" else -> "Unknown type" } fun main() { println(describe("Hello")) // String with length 5 println(describe(42)) // Integer with value 42 println(describe(3.14)) // Double with value 3.14 println(describe(true)) // Unknown type }
describe
函数使用 when
来检查其参数的类型。智能类型转换允许访问特定于类型的属性,例如 String 的长度。每个类型都获得不同的描述字符串。
when 没有参数
when
可以不带参数使用,就像一系列 if-else 条件。每个分支条件必须计算为布尔值。这种形式对于不符合标准模式的复杂条件很有用。
package com.zetcode fun main() { val x = 15 val y = 10 when { x > y -> println("x is greater than y") x < y -> println("x is less than y") else -> println("x and y are equal") } }
此示例在不使用 when
的参数的情况下比较两个变量。每个分支都包含一个布尔表达式。输出显示在这种情况下 x 大于 y。
when 与密封类
when
与密封类配合使用效果特别好,确保处理了所有子类。当涵盖所有可能的子类型时,编译器可以验证详尽性。这对于状态管理很有用。
package com.zetcode sealed class Result class Success(val data: String) : Result() class Error(val message: String) : Result() fun handleResult(result: Result) = when (result) { is Success -> println("Success: ${result.data}") is Error -> println("Error: ${result.message}") } fun main() { handleResult(Success("Data loaded")) handleResult(Error("Connection failed")) }
此示例演示了 when
如何处理密封类层次结构。编译器知道所有可能的 Result 子类型,因此不需要 else 分支。每个子类都以不同的方式处理。
when 的最佳实践
- 优先使用 when 而不是 if-else 链: 对于多个条件,使用
when
,因为它更具可读性。 - 利用表达式形式: 当返回值为更简洁的代码时,使用
when
作为表达式。 - 使用范围和类型检查: 充分利用 Kotlin 强大的匹配能力。
- 考虑密封类: 与密封类结合使用,进行详尽的类型检查。
- 保持分支简单: 如果分支变得太长,将复杂的逻辑移至单独的函数中。
来源
本教程深入介绍了 Kotlin 的 when
关键字,展示了它作为语句和表达式的多功能性。我们探讨了各种匹配模式,包括常量、范围、类型和密封类。正确使用 when
可以使条件逻辑更简洁、更具可读性。
作者
列出 所有 Kotlin 教程。