3、流程控制

选择结构

if-else

fun main(args: Array<String>) {
    var a = 10

    if (a == 1) println("a == 1")
    if (a == 10) println("a == 10")

    if (a == 1) {
        println("a == 1")
    } else {
        println("a != 1")
    }

    if (a == 1) {
        println("a == 1")
    } else if (a == 10) {
        println("a == 10")
    } else {
        println("a != 1 && a != 10")
    }
}

三元表达式

Kotlin 中没有Java 那样的三元表达式,但是可以使用 if-else 代替

注意:如果需要这种返回结果的表达式,那么必须要存在else分支

fun main(args: Array<String>) {
    var a = 10

    var result1 = if (a == 10) "a = 10" else "a != 10"

    var result2 = if (a == 10) {
        var str = "a = 10"
        str // 最后一行作为结果返回
    }else{
        var str = "a != 10"
        str
    }

    println(result1)
    println(result2)
}

when

when定义具有多个分支的条件表达式。它类似于类似Java和C语言中的switch语句。

fun main(args: Array<String>) {
    var a = 10

    when(a){
        10 -> println("a is 10")
        20 -> println("a is 20")
        else -> {
            println("a is not 10 or 20")
        }
    }
}

同样的,when 也可以作为表达式,类似三元表达式那样。

如果将when用作表达式,则else分支必须存在,除非编译器能推断出分支条件包含了所有可能的情况。

fun main(args: Array<String>) {
    var a = 10

    var str = when(a){
        10 -> "a is 10"
        20 -> "a is 20"
        else -> {
            "a is not 10 or 20"
        }
    }

    println(str)
}

循环结构

for

首先 Kotlin 提供了一种声明区间的方法,比如想要一个包含1、2、3 的区间,就可以这样声明:1..3

fun main(args: Array<String>) {
    for(i in 1..3){
        println(i)
    }
}

同时,可以控制步长,也就是每次循环变量的增减。

比如 java 中的循环for (int i = 1,i <= 10,i + 2),那么 Kotlin 的步长step 2就相当于i + 2,具体如下

fun main(args: Array<String>) {
    for (i in 1..10 step 2){
        println(i)
    }
}

那如果我们需要从10到1倒着进行遍历呢,那么就可以使用downTo

fun main(args: Array<String>) {
    for (i in 10 downTo 1){
        println(i)
    }
}

while

fun main() {
    var i = 100 //比如现在我们想看看i不断除以2得到的结果会是什么,但是循环次数我们并不明确

    while (i > 0) {   //现在唯一知道的是循环条件,只要大于0那么就可以继续除
        println(i)
        i /= 2 //每次循环都除以2
    }
}

我们也可以反转循环判断的时机,可以先执行循环内容,然后再做循环条件判断

fun main() {
    var i = 0 //比如现在我们想看看i不断除以2得到的结果会是什么,但是循环次数我们并不明确

    do {  //无论满不满足循环条件,先执行循环体里面的内容
        println("Hello World!")
        i++
    } while (i < 10) //再做判断,如果判断成功,开启下一轮循环,否则结束
}

循环控制

continue

我们可以使用continue关键字来跳过本轮循环,直接开启下一轮

break

我们可以使用break关键字来提前终止整个循环

嵌套循环下使用

虽然使用break和continue关键字能够更方便的控制循环,但是注意在多重循环嵌套下,它只对离它最近的循环生效(就近原则)

如果我们需要控制外层循环,那么就需要为循环语句打上标记

fun main(args: Array<String>) {
    outer@for (i in 1..10){
        for(j in 1 .. 10){
            if(i == 5) continue@outer
            println("$i x $j = ${i*j}")
        }
    }
}