Kotlin中的when结构是一个强大的工具,用于控制程序的执行流,取代了Java中的传统switch-case。when的引入旨在提高表达能力,减少样板代码,并提高类型安全性。
在Java中,switch-case结构仅限于某些特定类型(枚举、int、String)。与Java不同,Kotlin的开发者希望简化条件分支,使其更具表达性和安全性。
Java中的switch-case的限制使得代码的扩展和维护变得困难,尤其是在处理集合、比较范围或处理不同类型时。
Kotlin中的when结构是通用的:它可以作为表达式工作(可以返回值),支持条件检查、范围、单个值、类型和条件组合。
fun describe(obj: Any): String = when (obj) { 1 -> "One" in 2..10 -> "From two to ten" is String -> "String with length ${obj.length}" else -> "Unknown" } val res1 = describe(1) // "One" val res2 = describe(5) // "From two to ten" val res3 = describe("Kotlin") // "String with length 6" val res4 = describe(42.0) // "Unknown"
when可以不带参数使用吗?
是的,当不需要检查特定变量的值时,可以将when用作长if-else链的替代。
when { x < 0 -> println("Negative") x == 0 -> println("Zero") else -> println("Positive") }
when结构中的else块是必须的吗?
如果处理了所有可能的情况,比如对于枚举或密封类,则else块不是必需的。但是,如果存在未覆盖情况的可能性,则必须提供else以避免编译时错误。
sealed class Fruit object Apple : Fruit() object Pear : Fruit() fun check(f: Fruit): String = when (f) { Apple -> "It's an apple" Pear -> "It's a pear" // 没有else块,编译器不报错 — 所有情况都已考虑 }
可以在一个分支中使用多个值吗?
是的,可以通过逗号将多个值组合在一起。
when (value) { 0, 1 -> println("Zero or One") else -> println("Other") }
在支付系统中,switch-case用于确定操作状态。在添加新状态类型时,忘记更新switch。未处理的状态导致silent-error。
优点:
缺点:
在Kotlin中,使用密封类来表示状态,并使用when来处理它们。添加新状态时,编译器要求添加对新情况的处理。
优点:
缺点: