Kotlin 提供了多种控制流程结构,包括条件表达式、循环和跳转表达式。下面我将详细介绍 Kotlin 中的各种控制流程。
1. 条件表达式
1.1 if 表达式
在 Kotlin 中,if
是一个表达式,它会返回一个值。
// 传统用法
var max = a
if (a < b) max = b
// 作为表达式
val max = if (a > b) a else b
// 带有代码块的情况
val max = if (a > b) {
println("Choose a")
a
} else {
println("Choose b")
b
}
1.2 when 表达式
when
取代了类 C 语言中的 switch
,但功能更强大。
when (x) {
1 -> println("x == 1")
2 -> println("x == 2")
else -> { // 注意这个块
println("x is neither 1 nor 2")
}
}
when
也可以作为表达式:
val result = when (x) {
1 -> "one"
2 -> "two"
else -> "other"
}
when
可以检查多种条件:
when (x) {
in 1..10 -> println("x is in the range")
is String -> println("x is a string")
else -> println("none of the above")
}
2. 循环
2.1 for 循环
for
循环可以遍历任何提供了迭代器的对象。
for (item in collection) print(item)
// 带索引
for (i in array.indices) {
println(array[i])
}
// 使用 withIndex
for ((index, value) in array.withIndex()) {
println("the element at $index is $value")
}
范围遍历:
for (i in 1..3) { // 闭区间,包含3
println(i)
}
for (i in 6 downTo 0 step 2) { // 从6到0,每次减2
println(i)
}
for (i in 1 until 10) { // 半开区间,不包含10
println(i)
}
2.2 while 和 do-while 循环
// while
var x = 10
while (x > 0) {
x--
}
// do-while
do {
val y = retrieveData()
} while (y != null) // y 在此处可见
3. 跳转表达式
3.1 return
从最近的封闭函数或匿名函数返回。
fun foo() {
listOf(1, 2, 3, 4, 5).forEach {
if (it == 3) return // 非局部直接返回到 foo() 的调用者
print(it)
}
println("this point is unreachable")
}
3.2 break 和 continue
break
终止最近的封闭循环,continue
继续下一次循环。
loop@ for (i in 1..100) {
for (j in 1..100) {
if (j == 5) break@loop // 直接跳出外层循环
}
}
3.3 标签处返回
Kotlin 有函数字面量、局部函数和对象表达式,因此函数可以被嵌套。return
允许我们从外层函数返回。
fun foo() {
listOf(1, 2, 3, 4, 5).forEach lit@{
if (it == 3) return@lit // 局部返回到该 lambda 表达式的调用者,即 forEach 循环
print(it)
}
print(" done with explicit label")
}
或者使用隐式标签(与接受 lambda 的函数同名):
fun foo() {
listOf(1, 2, 3, 4, 5).forEach {
if (it == 3) return@forEach // 局部返回到该 lambda 表达式的调用者
print(it)
}
print(" done with implicit label")
}
4. 异常处理
Kotlin 使用 try-catch-finally
来处理异常。
try {
// 一些代码
} catch (e: SomeException) {
// 处理异常
} finally {
// 可选的 finally 块
}
try
也可以作为表达式:
val result = try {
Integer.parseInt("123")
} catch (e: NumberFormatException) {
null
}
5. 作用域函数
Kotlin 提供了几个作用域函数(let
, run
, with
, apply
, also
),虽然不是严格的控制流程,但可以影响代码的执行方式。
val str = "Hello"
str.let {
println(it.length) // 打印 5
}
val numbers = mutableListOf("one", "two", "three")
numbers.apply {
add("four")
add("five")
}.also {
println(it) // 打印 [one, two, three, four, five]
}
总结
Kotlin 的控制流程结构既保留了传统编程语言的特性,又通过表达式化的设计(如 if 和 when 表达式)和灵活的跳转控制(如标签返回)提供了更强大的功能和更简洁的语法。理解这些控制流程对于编写高效、清晰的 Kotlin 代码至关重要。