当前位置:嗨网首页>书籍在线阅读

14-when语句

  
选择背景色: 黄橙 洋红 淡粉 水蓝 草绿 白色 选择字体: 宋体 黑体 微软雅黑 楷体 选择字体大小: 恢复默认

4.5.2 when语句

在Kotlin中,when取代了C风格语言的switch语句,相比switch语句而言,when语句更加强大、灵活性更好。一个简单的when语句形式如下。

val x : Int = 10
when (x) {
    9 -> println("x:${x + 10}")
    10 -> println("x:$x")
    else -> print("x:$x")
}

在具体使用的时候,when会对所有的分支进行检查,直到有一个条件满足为止,when既可以被当作表达式使用,也可以被当作语句使用。如果当作表达式使用,则符合条件的分支的值就是整个表达式的值;如果当作语句使用,则不满足条件的分支的值会被忽略,只保留满足条件的分支,而且返回的也是最后一个表达式的值。

如果有很多分支需要用相同的方式处理,则可以将多个分支条件放在一起,分支之间用逗号分隔。代码如下。

val x : Int = 10
    when (x) {
        0,1 -> print("x == 0 or x == 1")
        else -> print("otherwise")
    }

如果要执行相同代码的条件比较多或无法枚举,则可以使用in或者!in来确定一个范围。

var n = 25
    when(n) {
        in 1..10 ->println("在1~10范围内")
        in 11.. 20 ->println("在11~20范围内条件")
        !in 30..60 ->println("不再上面的范围内")   // !in表示不在范围内
        else->println("在其他范围内")
    }

除了检测范围之外,另一种可能性检测是使用is或者!is来检测一个特定类型的值。

fun main(args: Array<String>) {
    var x="that is prefix"
    hasPrefix(x)
}
fun hasPrefix(x: Any) = when(x) {
    is String -> println(x.startsWith("prefix"))  //输出flase
    else -> false
}

其实,when中的分支条件不仅可以是常量,还可以是任意表达式。

fun main(args: Array<String>) {
    val x=10
    val s=5
    when (x) {
        parseInt(s) -> print("s encodes x")
        else -> print("s does not encode x")
    }
}
fun parseInt(x:Int):Int {
    return x * x
}

除此之外,when还可以用来取代if-else if语句链,如果不提供参数,那么所有的分支条件都是布尔表达式,当其中某个分支的条件为真时执行该分支。

when {
    x.isOdd() -> print("x is odd")
    x.isEven() -> print("x is even")
    else -> print("x is funny")
}