首页 / Android 入门教程 / 控制流

Android 入门教程

控制流

本教程共 100 篇 · 第 11 篇 · 更新于 2026-07-28 · 约 7 分钟阅读

AndroidAndroid 入门教程Kotlin控制流if 表达式whenfor 循环range

11. 控制流

本节目标:掌握 Kotlin 的条件判断(if、when)和循环(for、while、range),知道它们比 Java 的 if/switch 强在哪。

if 表达式

Kotlin 的 if 既能当语句用,也能当表达式用(有返回值):

// 当语句
val score = 85
if (score >= 60) {
    println("及格")
} else {
    println("不及格")
}

// 当表达式
val result = if (score >= 60) "及格" else "不及格"

当表达式用时,每个分支最后一行就是返回值。这是 Java 没有的特性,能替代三元运算符(Kotlin 没有三元 ? :,因为 if 表达式够用)。

val level = if (score >= 90) {
    "优秀"
} else if (score >= 60) {
    "及格"
} else {
    "不及格"
}
Note
  • 当表达式的 if,每个分支必须有返回值,且类型要兼容。else 分支不能省。

when:升级版 switch

Kotlin 的 when 是 Java switch 的强力升级版,能匹配值、范围、类型、任意条件。

匹配值

val day = 3
val dayName = when (day) {
    1 -> "周一"
    2 -> "周二"
    3 -> "周三"
    4 -> "周四"
    5 -> "周五"
    6, 7 -> "周末"        // 多值合并
    else -> "未知"
}

匹配范围和条件

val score = 85
val grade = when {
    score >= 90 -> "A"
    score >= 80 -> "B"
    score >= 70 -> "C"
    score >= 60 -> "D"
    else -> "F"
}

不传参数的 when,每个分支是独立布尔表达式,从上往下匹配,第一个为真的分支胜出。

匹配类型

fun describe(obj: Any): String = when (obj) {
    is String -> "字符串,长度 ${obj.length}"   // is 判断类型后自动智能转换
    is Int -> "整数 $obj"
    is Boolean -> if (obj) "真" else "假"
    else -> "其他类型"
}

is 判断类型后,obj 在分支里自动被当作对应类型用,不用强转,这叫智能转换(Smart Cast)。

Tip
  • Android 里 when 用得特别多:处理点击事件、解析 Intent action、根据状态显示 UI,都比 if-else 链清爽。

for 循环

Kotlin 的 for 没有传统 C 风格的 for (int i=0; i<n; i++),统一用 for-in 遍历。

遍历区间

for (i in 1..5) {
    println(i)        // 1 2 3 4 5
}

for (i in 1 until 5) {
    println(i)        // 1 2 3 4,不含 5
}

for (i in 5 downTo 1) {
    println(i)        // 5 4 3 2 1,倒序
}

for (i in 1..10 step 2) {
    println(i)        // 1 3 5 7 9,步长 2
}

区间符号:

  • a..b:闭区间 [a, b]
  • a until b:半开区间 [a, b)
  • a downTo b:倒序从 a 到 b。
  • step n:步长。

遍历集合

val list = listOf("A", "B", "C")
for (item in list) {
    println(item)
}

// 带索引
for ((index, item) in list.withIndex()) {
    println("$index: $item")
}

遍历 Map

val map = mapOf("a" to 1, "b" to 2)
for ((key, value) in map) {
    println("$key = $value")
}

while 与 do-while

跟其他语言一样,Kotlin 也有 whiledo-while

var i = 0
while (i < 5) {
    println(i)
    i++
}

var j = 0
do {
    println(j)
    j++
} while (j < 5)
Note
  • 日常开发 for-in 用得多,while 适合不确定循环次数的场景(读流、轮询)。

break、continue、return

for (i in 1..10) {
    if (i == 3) continue      // 跳过本次,继续下次
    if (i == 7) break         // 跳出整个循环
    println(i)                // 输出 1 2 4 5 6
}

标签(跳出到指定层)

嵌套循环时想跳出外层,用标签:

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

forEach 里的 return

forEach 是个高阶函数,里面 return 默认从 forEach 返回(相当于 continue),想从外层函数返回要用标签:

fun findFirstEven(list: List<Int>): Int {
    list.forEach {
        if (it % 2 == 0) return it      // 从 findFirstEven 返回
    }
    return -1
}

Android 里的实际用法

// 处理不同通知渠道
when (channelId) {
    "message" -> showMessageNotification()
    "update" -> showUpdateNotification()
    else -> showDefaultNotification()
}

// 根据屏幕宽度选布局
val windowSize = when {
    widthDp < 600 -> "Compact"
    widthDp < 840 -> "Medium"
    else -> "Expanded"
}

// 遍历列表渲染 Compose
items.forEach { item ->
    // 渲染每个 item
}

小结

if 能当表达式有返回值。when 是强力 switch,能匹配值、范围、类型。for-in 配合 ..untildownTostep 遍历区间和集合。while 用于不确定次数的循环。break/continue 能配标签跳出指定层。下一节学函数。