跳到主要内容

Kotlin 控制流

本章将介绍 Kotlin 中的条件语句和循环结构。

if 表达式

在 Kotlin 中,if 可以作为表达式使用(返回值)。

基本用法

fun main() {
val a = 10
val b = 20

// 传统用法
if (a > b) {
println("a > b")
} else if (a < b) {
println("a < b")
} else {
println("a == b")
}
}

if 作为表达式

fun main() {
val a = 10
val b = 20

// if 作为表达式,返回值
val max = if (a > b) a else b
println("max = $max")

// 带有代码块的 if 表达式
val result = if (a > b) {
println("选择 a")
a // 最后一个表达式作为返回值
} else {
println("选择 b")
b
}
println("result = $result")
}

区间检查

fun main() {
val x = 5

// 使用区间检查
if (x in 1..10) {
println("x 在 1 到 10 之间")
}

// 组合条件
if (x in 1..10 && x % 2 == 1) {
println("x 是 1-10 之间的奇数")
}
}

when 表达式

when 是 Kotlin 强大的条件表达式,可以替代 Java 的 switch

基本用法

fun main() {
val x = 2

when (x) {
1 -> println("x 是 1")
2 -> println("x 是 2")
3, 4 -> println("x 是 3 或 4")
else -> println("x 是其他值")
}
}

when 作为表达式

fun main() {
val x = 3

val result = when (x) {
1 -> "one"
2 -> "two"
3 -> "three"
else -> "other"
}
println("result = $result")
}

多种匹配方式

fun main() {
val x = 15

when (x) {
// 区间匹配
in 1..10 -> println("1-10")
in 11..20 -> println("11-20")

// 类型匹配
is Int -> println("Int 类型,值为 $x")

// 条件匹配
x % 2 == 0 -> println("偶数")
else -> println("其他")
}
}

智能类型转换

fun main() {
val obj: Any = "Hello"

when (obj) {
is String -> {
// obj 自动转换为 String
println("字符串长度: ${obj.length}")
}
is Int -> {
// obj 自动转换为 Int
println("Int 值: $obj")
}
else -> {
println("其他类型")
}
}
}

when 替代 if-else-if

fun main() {
val score = 85

val grade = when {
score >= 90 -> "A"
score >= 80 -> "B"
score >= 70 -> "C"
score >= 60 -> "D"
else -> "F"
}
println("成绩等级: $grade")
}

for 循环

基本用法

fun main() {
// 遍历区间
for (i in 1..5) {
print("$i ") // 1 2 3 4 5
}
println()

// 遍历数组
val fruits = listOf("Apple", "Banana", "Orange")
for (fruit in fruits) {
println(fruit)
}
}

区间变体

fun main() {
// 包含结束值
for (i in 1..5) print(i) // 1 2 3 4 5

// 不包含结束值 until
for (i in 1 until 5) print(i) // 1 2 3 4

// 倒序
for (i in 5 downTo 1) print(i) // 5 4 3 2 1

// 步长
for (i in 1..10 step 2) print(i) // 1 3 5 7 9

// 倒序步长
for (i in 10 downTo 1 step 3) print(i) // 10 7 4 1
}

遍历索引

fun main() {
val fruits = listOf("Apple", "Banana", "Orange")

// 方式1:indices
for (i in fruits.indices) {
println("$i: ${fruits[i]}")
}

// 方式2:withIndex
for ((index, value) in fruits.withIndex()) {
println("$index: $value")
}
}

遍历 Map

fun main() {
val map = mapOf("a" to 1, "b" to 2, "c" to 3)

// 遍历 entry
for ((key, value) in map) {
println("$key -> $value")
}
}

while 循环

while

fun main() {
var count = 0

while (count < 5) {
println("count = $count")
count++
}
}

do-while

fun main() {
var count = 0

do {
println("count = $count")
count++
} while (count < 5)

// do-while 至少执行一次
var input: String?
do {
print("输入 'quit' 退出: ")
input = readLine()
println("你输入了: $input")
} while (input != "quit")
}

循环控制

break 和 continue

fun main() {
// break - 跳出循环
for (i in 1..10) {
if (i == 5) break
print("$i ") // 1 2 3 4
}
println()

// continue - 跳过本次循环
for (i in 1..5) {
if (i == 3) continue
print("$i ") // 1 2 4 5
}
println()
}

带标签的 break 和 continue

fun main() {
// 使用标签控制外层循环
outer@ for (i in 1..3) {
for (j in 1..3) {
println("i = $i, j = $j")
if (i == 2 && j == 2) {
break@outer // 直接跳出外层循环
}
}
}

// continue 带标签
for (i in 1..3) {
for (j in 1..3) {
if (j == 2) continue@for
println("i = $i, j = $j")
}
}
}

区间(Range)

创建区间

fun main() {
// 闭区间:包含两端
val closedRange = 1..10

// 半开区间:不包含结束
val halfOpen = 1 until 10

// 倒序区间
val reversed = 10 downTo 1

// 使用 step
val stepped = 1..10 step 2

// 字符区间
val charRange = 'a'..'z'

println('c' in charRange) // true
}

区间操作

fun main() {
val range = 1..10

// 检查是否包含
println(5 in range) // true
println(0 in range) // false

// 区间迭代
for (i in range) {
print("$i ")
}
println()

// 区间反转
for (i in range.reversed()) {
print("$i ")
}
}

范围检查

fun main() {
val x = 5

// 使用 in 检查
println(x in 1..10) // true
println(x !in 1..10) // false

// 组合检查
println(x in 1..10 && x > 3) // true
}

小结

本章我们学习了:

  1. if 表达式:可以作为表达式返回值
  2. when 表达式:强大的模式匹配,替代 switch
  3. for 循环:遍历区间、集合、数组
  4. while 循环:while 和 do-while
  5. 循环控制:break、continue、标签
  6. 区间:创建和使用区间

练习

  1. 使用 when 判断一个数的正负零
  2. 使用 for 循环计算 1 到 100 的和
  3. 使用循环打印九九乘法表
  4. 使用 when 判断成绩等级(A/B/C/D/F)
  5. 使用标签实现寻找两个数组共同元素