Kotlin 循环控制 #

一、break 语句 #

1.1 基本用法 #

break 用于立即终止循环:

kotlin
for (i in 1..10) {
    if (i == 5) break
    println(i)
}
// 输出: 1, 2, 3, 4

1.2 在 while 中使用 #

kotlin
var i = 1
while (true) {
    println(i)
    if (i >= 5) break
    i++
}
// 输出: 1, 2, 3, 4, 5

1.3 查找元素 #

kotlin
val numbers = listOf(1, 3, 5, 7, 9, 2, 4, 6, 8)

var firstEven = -1
for (num in numbers) {
    if (num % 2 == 0) {
        firstEven = num
        break
    }
}

println("第一个偶数: $firstEven")  // 2

二、continue 语句 #

2.1 基本用法 #

continue 用于跳过当前迭代,继续下一次:

kotlin
for (i in 1..10) {
    if (i % 2 == 0) continue
    println(i)
}
// 输出: 1, 3, 5, 7, 9

2.2 过滤元素 #

kotlin
val words = listOf("apple", "", "banana", "", "cherry")

for (word in words) {
    if (word.isEmpty()) continue
    println(word)
}
// 输出: apple, banana, cherry

2.3 处理数据 #

kotlin
val numbers = listOf(1, -2, 3, -4, 5, -6)

var sum = 0
for (num in numbers) {
    if (num < 0) continue  // 跳过负数
    sum += num
}

println("正数之和: $sum")  // 9

三、标签 #

3.1 定义标签 #

标签使用 @ 后缀定义:

kotlin
outer@ for (i in 1..3) {
    for (j in 1..3) {
        println("i=$i, j=$j")
    }
}

3.2 标签 break #

跳出指定层级的循环:

kotlin
outer@ for (i in 1..3) {
    for (j in 1..3) {
        if (i == 2 && j == 2) break@outer
        println("i=$i, j=$j")
    }
}
// 输出:
// i=1, j=1
// i=1, j=2
// i=1, j=3
// i=2, j=1

3.3 标签 continue #

跳到指定层级的下一次迭代:

kotlin
outer@ for (i in 1..3) {
    for (j in 1..3) {
        if (j == 2) continue@outer
        println("i=$i, j=$j")
    }
}
// 输出:
// i=1, j=1
// i=2, j=1
// i=3, j=1

3.4 多层嵌套 #

kotlin
loop1@ for (i in 1..3) {
    loop2@ for (j in 1..3) {
        loop3@ for (k in 1..3) {
            if (i == 2 && j == 2 && k == 2) break@loop1
            println("i=$i, j=$j, k=$k")
        }
    }
}

四、return 语句 #

4.1 基本用法 #

return 用于从函数返回:

kotlin
fun findElement(list: List<Int>, target: Int): Int {
    for ((index, value) in list.withIndex()) {
        if (value == target) {
            return index
        }
    }
    return -1
}

4.2 标签 return #

在 lambda 中使用标签 return:

kotlin
val list = listOf(1, 2, 3, 4, 5)

list.forEach lit@{
    if (it == 3) return@lit  // 跳过 3,继续处理
    println(it)
}
// 输出: 1, 2, 4, 5

4.3 隐式标签 #

使用函数名作为隐式标签:

kotlin
fun processList(list: List<Int>) {
    list.forEach {
        if (it == 3) return@forEach  // 等同于 continue
        println(it)
    }
    println("处理完成")
}

4.4 return vs return@label #

kotlin
fun example() {
    listOf(1, 2, 3, 4, 5).forEach {
        if (it == 3) return  // 直接返回整个函数
        println(it)
    }
    println("这行不会执行")
}

fun example2() {
    listOf(1, 2, 3, 4, 5).forEach {
        if (it == 3) return@forEach  // 只跳过当前迭代
        println(it)
    }
    println("这行会执行")
}

五、在 forEach 中控制循环 #

5.1 模拟 break #

kotlin
val list = listOf(1, 2, 3, 4, 5)

// 使用 takeWhile 模拟 break
list.takeWhile { it != 4 }.forEach {
    println(it)
}
// 输出: 1, 2, 3

5.2 模拟 continue #

kotlin
val list = listOf(1, 2, 3, 4, 5)

// 使用 filter 模拟 continue
list.filter { it != 3 }.forEach {
    println(it)
}
// 输出: 1, 2, 4, 5

5.3 使用 run 和 return #

kotlin
val list = listOf(1, 2, 3, 4, 5)

run {
    list.forEach {
        if (it == 4) return@run  // 跳出 run 块
        println(it)
    }
}
// 输出: 1, 2, 3

六、实战示例 #

6.1 查找二维数组元素 #

kotlin
fun findIn2DArray(matrix: Array<IntArray>, target: Int): Pair<Int, Int>? {
    outer@ for (i in matrix.indices) {
        for (j in matrix[i].indices) {
            if (matrix[i][j] == target) {
                return Pair(i, j)
            }
        }
    }
    return null
}

6.2 验证输入 #

kotlin
fun validateInputs(inputs: List<String>): Boolean {
    inputs.forEach { input ->
        if (input.isBlank()) return false
        if (input.length > 100) return false
    }
    return true
}

6.3 处理嵌套数据 #

kotlin
data class Department(val name: String, val employees: List<String>)

fun findEmployee(departments: List<Department>, name: String): String? {
    departments.forEach dept@{ dept ->
        dept.employees.forEach emp@{ emp ->
            if (emp == name) {
                return "${dept.name}: $emp"
            }
        }
    }
    return null
}

6.4 游戏循环 #

kotlin
fun gameLoop() {
    game@ while (true) {
        val input = readInput()
        
        when {
            input == "quit" -> break@game
            input == "pause" -> {
                pause@ while (true) {
                    val pauseInput = readInput()
                    when {
                        pauseInput == "resume" -> break@pause
                        pauseInput == "quit" -> break@game
                    }
                }
            }
            else -> processInput(input)
        }
    }
}

七、最佳实践 #

7.1 避免过度使用标签 #

kotlin
// 不推荐:复杂的标签跳转
outer@ for (i in 1..10) {
    inner@ for (j in 1..10) {
        if (condition1) continue@outer
        if (condition2) break@inner
        if (condition3) break@outer
    }
}

// 推荐:使用函数封装
fun processMatrix(matrix: Array<IntArray>): Boolean {
    for (row in matrix) {
        if (!processRow(row)) return false
    }
    return true
}

7.2 使用函数式替代 #

kotlin
// 不推荐
var found = false
for (item in list) {
    if (item == target) {
        found = true
        break
    }
}

// 推荐
val found = list.any { it == target }

7.3 提前返回 #

kotlin
// 不推荐
fun process(data: String?): String {
    var result = ""
    if (data != null) {
        if (data.isNotEmpty()) {
            result = data.uppercase()
        }
    }
    return result
}

// 推荐
fun process(data: String?): String {
    if (data.isNullOrEmpty()) return ""
    return data.uppercase()
}

八、总结 #

循环控制语句:

语句 用途 作用范围
break 跳出循环 当前循环
continue 跳过当前迭代 当前循环
break@label 跳出指定循环 标签指定的循环
continue@label 跳到指定循环的下一次迭代 标签指定的循环
return 从函数返回 整个函数
return@label 从 lambda 返回 标签指定的 lambda

下一步,让我们学习 函数基础

最后更新:2026-03-27