流程控制

if,else if,else

if (条件判断) 判断成功执行的代码;
fun main() {
    val a = 10
    if(a == 12)  //只有当a判断等于12时,才会执行下面的打印语句
        println("Hello World!")
    println("我是后续的语句")  //if只会对紧跟着的一行代码生效,后续的内容无效
}

如果if体中有多行语句,需要使用{}包裹,只有一行就可以忽略{},类似的 else ifelseforwhile等都是这样:

if (a > 100) {
    println("a > 100")
    println("a: $a")
}
fun main() {
    val a = 100
    if (a > 10) { // 判断成功时执行内部代码
        println("a > 10")
        println("a : $a")
    } else // 判读失败执行else内部代码
        println("a < 10")
}

多分支判断:


fun testIf() {
    val score = 100
    if (score > 90)
        println("优秀")
    else if (score >= 70)
        println("良好")
    else if (score >= 60)
        println("及格")
    else
        println("不及格")
}

嵌套if:

if (score < 60) {
    if (score < 30 ) {
        println("学习Java")
    } else {
        println("学习Kotlin")
    }
}
if (score < 60) {
    if (score < 30 ) {
        println("学习Java")
    } else {
        println("学习Kotlin")
    }
}

作为返回结果赋值:

类似于Java中你的三元表达式,不过 Kotlin中没有三元运算符,对于if,else多行代码的情况,默认最后一行作为返回结果,这种表达式必须存在else分支,否则不满足条件不就没结果了?

fun testIf2() {
    val score = 32
    val result = if (score shr 1 > 10) "1" else "0"
    println(result)
}

when

类似于if-elseif-else

fun testWhen1() {
    val rank = 'A'
    when (rank) {
        'A' -> println("王者")
        'B' -> println("星耀")
        'C' -> println("钻石")
    }
}

当用when做表达式时,需要存在else分支,除非编译器能推断出所有可能的情况都包含分支条件

fun testWhen2() {
    val c = 'A'
    val value = when (c) {
        'A' -> 0
        'B' -> 1
        else -> 2
    }
    println(value)
    val d = true
    val res = when (d) {
        true -> 1
        false -> 0
    }
    println(res)
}

有时候我们可能希望某些值都属于同一个情况,可以使用逗号将其条件组合成一行:

when (x) {
    0, 1 -> print("x == 0 or x == 1")
    else -> print("else")
}

我们也可以使用任意表达式(不仅仅是常量)作为分支条件,比如之前的if-elseif-else:

fun testWhen3() {
    val score = 70
    val value = when(score) {
        //使用in判断目标变量值是否在指定范围内
        in 90..100 -> "优秀"
        in 80..89 -> "良好"
        in 70..79 -> "及格"
        in 60..69 -> "牛逼"
        else -> "不及格"
    }
    println(value)
}

for循环

基本语法:

for (遍历出来的单个目标变量 in 可遍历目标) 循环体
fun testFor1() {
    for (i in 1..10) {
        println("$i")
    }
}

每次遍历的变量i,就是每次遍历的下一个目标,这里依次是1~10,需要注意的是,变量i只在for内部有用,包括嵌套的内部。

如果外部定义了i,在for中使用i作为遍历变量,不会改变i的值:

fun testFor2() {
    var i: Int = 100
    for (i in 1..10) {
        println(i)
    }
    println(i)
}

image-20240408203030703

默认每次循环都会使i+1,使用step可以自由控制步长:

fun testFor3() {
    for (i in 1..10 step 2) {
        println(i)
    }
}

image-20240408203136372

倒序遍历可以使用 downTo

fun testFor3() {
    for (i in 10 downTo 1 step 2) {
        println(i)
    }
}

使用 continue跳过本轮循环,直接开始下一轮,尽管循环体后面还有代码未执行:

fun testFor4() {
    for (i in 1..3) {
        if (i == 2) continue
        println(i)
    }
}

只会打印1和3

如果需要提前结束循环,可以使用 break关键字,如果存在多从嵌套循环,只会对离它最近的循环生效,continue也是一样


fun testFor5() {
    for (i in 1..3) {
        for (j in 1..3) {
            if (i == j) break
            println("$i $j")
        }
    }
}

image-20240408204016210

如果想要终止或者加速外部循环,可以为循环打上标记:

fun testFor6() {
    outer@ for (i in 1..3) {
        inner@ for (j in 1..3) {
            if (i == j) continue@outer
            println("$i $j")
        }
    }
}

image-20240408204230928

while循环

while(循环条件) 循环体;

相比for循环,while循环更多的用在不明确具体的结束时机的情况下,而for循环更多用于明确知道循环的情况,比如在明确要进行循环10次,此时用for循环会更加合适一些,若只知道i<=0时要结束循环,就用while比较合适:

fun testWhile1() {
    var i = 100
    while (i > 0) {
        println(i)
        i /= 2
    }
}

image-20240408204724242

与for循环一样,也可以使用continue或者break加速或者提前结束循环:

fun testWhile2() {
    var i = 100
    while (i > 0) {
        if (i < 10) break
        println(i)
        i /= 2
    }
}

我们也可以反转循环判断的时机,可以先执行循环内容,然后再做循环条件判断,这里要用到 do-while语句:

fun testWhile3() {
    var i = 100
    do {
        println("i: $1")
        i /= 2
    } while (i > 0)
}

这样不论是否满足执行条件,循环体中的内容都会先执行一遍