控制流与区间
Kotlin 的控制流设计强调 表达式 (Expression) 优先。大多数控制结构(如 if 和 when)都有返回值,这使得代码更加紧凑且易于组合。
if 表达式
在 Kotlin 中,if 是一个表达式,它可以返回一个值。因此,Kotlin 不需要三元运算符 (condition ? a : b)。
kotlin
val max = if (a > b) a else b块级返回值
如果 if 分支是一个代码块,那么块内的最后一个表达式就是该块的返回值。
when 表达式:强大的匹配器
when 取代了传统的 switch,但其功能远超后者。
核心特性
- 支持任意类型:不仅是常量或枚举,可以是表达式、类型、区间。
- 穷举性检查 (Exhaustiveness):当作为表达式使用时,编译器会强制要求覆盖所有可能的分支(通常结合
sealed class或enum使用)。 - 无 Case 穿透:每个分支执行完后自动结束,不需要
break。
kotlin
when (x) {
1 -> print("x == 1")
2, 3 -> print("x == 2 or 3")
in 10..20 -> print("x is in the range")
is String -> print("x is a String of length ${x.length}")
else -> print("otherwise")
}kotlin
// 替代长串 if-else if
when {
x.isOdd() -> print("x is odd")
y.isEven() -> print("y is even")
else -> print("x+y is funny")
}区间与步长 (Ranges and Progressions)
Kotlin 通过区间语法简化了数值序列的操作。
- 闭区间:
1..10(包含 1 和 10)。 - 左闭右开:
1 until 10(包含 1,不包含 10)。 - 倒序:
10 downTo 1。 - 步长:
1..10 step 2(1, 3, 5, 7, 9)。
底层实现
对于 IntRange 等基本类型区间,编译器会将其优化为原始的 for (int i = 0; i <= 10; i++) 循环,不会产生多余的对象开销。
循环结构
for 循环
for 循环可以遍历任何提供了迭代器 (Iterator) 的对象。
kotlin
for (item in collection) print(item)
// 带索引遍历
for ((index, value) in array.withIndex()) {
println("the element at $index is $value")
}while 与 do-while
与 Java 保持一致,但注意 Kotlin 中的变量作用域更加严格。
跳转与返回
- return:默认从最近的封闭函数或匿名函数返回。
- break 与 continue:支持 标签 (Labels),允许从嵌套循环中直接跳出到外层。
kotlin
loop@ for (i in 1..10) {
for (j in 1..10) {
if (j == 5) break@loop // 直接跳出外层循环
}
}Kotlin 2.0 增强型智能转换 Kotlin 2.0+
在 Kotlin 2.0 中,编译器对控制流的分析更加智能。
复杂逻辑下的 Smart Cast
以前,如果在 if 之外修改了变量,智能转换可能会失效。2.0 的 K2 编译器能够通过更深的数据流分析,在更多复杂的 when 分支和逻辑组合中保持类型的自动转换,显著减少了显式 as 的使用。
总结
- 表达式思维:利用
if和when的返回值减少临时变量。 - when 是瑞士军刀:它比
switch更安全且表达力更强。 - 区间让代码更自然:避免繁琐的循环边界计算。
- 标签跳转:在处理多层嵌套时,它是保持逻辑清晰的良药。