10. 分支语句---if & when

Kotlin

if表达式

Kotlin中,if是一个表达式,即它会返回一个值。

// 传统⽤法
var max = a
if (a < b) max = b

// With else
var max: Int
if (a > b) {
max = a
} else {
max = b
}

// 作为表达式
val max = if (a > b) a else b

if的分支可以是代码块,最后的表达式作为该块的值:

val max = if (a > b) {
    print("Choose a")
    a
} else {
    print("Choose b")
    b
}

如果你使用if作为表达式而不是语句,该表达式需要有else分支。

private const val USERNAME = "Kotlin";
private const val PASSWORD = "Jetbranis";

private const val ADMIN_USER = "admin";
private const val ADMIN_PASSWD = "admin";

private const val DEBUG = 1;
private const val USER = 0;

fun main(args: Array<String>) {

    // if表达式
    val mode: Int = if (args.isNotEmpty() && args[0] == "1") {
        DEBUG;
    } else {
        USER;
    }

    println("请输入用户名:");
    val userName = readLine();

    println("请输入密码:");
    val passWord = readLine();

    if (mode == DEBUG && userName == ADMIN_USER && passWord == ADMIN_PASSWD) {
        println("管理员登录成功");
    } else if (userName == USERNAME && passWord == PASSWORD) {
        println("登录成功");
    } else {
        println("登录失败");
    }

}

when表达式

when取代了类C语言的switch操作符。

when (x) {
    1 -> print("x == 1")
    2 -> print("x == 2")
    else -> { // 注意这个块
        print("x is neither 1 nor 2")
    }
}

when将它的参数与所有的分支条件顺序比较,直到某个分支满足条件。when既可以被当做表达式使用也可以被当做语句使用。

fun main(args: Array<String>) {

    val x = 5;

    when (x) {
        1 -> println("x == 1");
        2 -> println("x == 2");
        3, 4 -> println("x == 3 or x == 4");
        is Int -> println("Hello $x");
        in 1..100 -> println("$x is in 1..100");
        !in 1..100 -> println("$x is not 1..100");
        args[0].toInt() -> println("x == args[0]");
        else -> {
            println("相当于switch的default");
        }
    }

    val mode = when {
        args.isNotEmpty() && args[0] == "1" -> 1;
        else -> 0
    }

}

如果它被当做表达式,符合条件的分支的值就是整个表达式的值,如果当做语句使用,则忽略个别分支的值。
如果其他分支都不满足条件将会求值else分支。
如果when作为一个表达式使用,则必须有else分支。

推荐阅读更多精彩内容