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
}
小结
本章我们学习了:
- if 表达式:可以作为表达式返回值
- when 表达式:强大的模式匹配,替代 switch
- for 循环:遍历区间、集合、数组
- while 循环:while 和 do-while
- 循环控制:break、continue、标签
- 区间:创建和使用区间
练习
- 使用 when 判断一个数的正负零
- 使用 for 循环计算 1 到 100 的和
- 使用循环打印九九乘法表
- 使用 when 判断成绩等级(A/B/C/D/F)
- 使用标签实现寻找两个数组共同元素