二、Kotlin 控制流程详解

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 提供了几个作用域函数(letrunwithapplyalso),虽然不是严格的控制流程,但可以影响代码的执行方式。

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 代码至关重要。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值