流程控制:条件语句

Kotlin 的流程控制,我们分为两部分来介绍,第一部分是条件语句,第二部分是循环语句。今天我们首先看一下 Kotlin 中的条件语句:

1. if - else 条件判断语句

作为一门更加现代的编程语言,Kotlin 中的 if 条件语句与其他类 C 语言相比,最大的区别在于if 语句本身就是个有返回值的表达式。我们用一个最简单的 max 函数作一下对比:

// Java 语言写法public static int max(int a, int b) {
    if (a <= b)
        return b;
    else
        return a;
    // 或者使用三目运算符 return (a <= b)?b:a;}

由于 if - else 语句在 Java 不是个表达式,我们必须在判断条件后执行返回语句,这让每个条件判断变得臃肿无比。Java 为了简化条件判断语句引入三目运算符,但滥用三目运算符的结果是,一长串 ? 和 : 把清晰的逻辑变得混乱不堪,让代码的可阅读性变得十分低下。

然而,使用 Kotlin,我们能把逻辑写得清清楚楚,让代码变得简洁清晰:

 // Kotlin 写法fun max(a: Int, b: Int) = if(a <= b) b else a

当然,如果还是习惯不了这种过于简洁的写法,依然可以把 if 当作语句使用:

 // Kotlin 中的传统写法fun max(a: Int, b: Int) {
    if (a <= b) 
        return b 
    else 
        return a}

这里我们有个地方需要注意,如果我们把 if 语句当作表达式使用,那么一定要有 else 部分

我们val a = 1val b = 0val max = if (a <= b) b看一下上面的语句,因为 a <= b 的结果为 false,所以代码并不会执行到将 b 赋给 max 的部分,max 实际上是 null, 这时我们再执行其他语句就会出现错误。Kotlin 为避免出现这样的问题,在编译时就要求,作为表达式使用的 if 语句,必须要有 else 语句与之搭配,否则就会出现编译错误。

2. when 条件选择语句

在初学 C 和 Java 的 switch 语句时,我被它坑得不浅,用几个布尔表达式作为选择分支的条件,结果自然是编译错误。仔细查看语法规范才明白,C 的 switch 语句只能把整数常量作为判断条件,Java 的选择大一点,却也只扩大到整数的封装类、字符串和枚举,一旦加入一点复杂的逻辑,我们就得用成堆的 if - else 语句,难道我们就不能把布尔表达式作为判断分支的条件吗?Kotlin 做到了这一点。

Kotlin 使用 when 语句替代类 C 语言中的 switch 语句,但它比 switch 更加强大。

首先,switch 能做的,when 也能做:

 // 输入 xwhen (x) {
    //判断条件 -> 执行语句
    1 -> println("x = 1")
    2 -> println("x = 2")
    // 上面条件都不满足时执行
    else -> println("x is neither 1 nor 2")}

清晰无比。当 x 为 1 时,打印 x = 1;当 x 为 2 时,打印 x = 2;当上面的条件都不满足时,打印 x is neither 1 nor 2。

简化一下代码吧,我们能轻易发现,当 x 为 1 或 2 时,执行的其实是一个操作,于是我们可以这样写:

 // 输入 xwhen (x) {
    //使用 "," 分隔多个条件
    1, 2 -> println("x = $x")
    else -> println("x is neither 1 nor 2")}

在这里,Kotlin 的 when 语句就已经比 switch 语句高出一截了,但它更强大的还在后面:

 // 输入 xwhen (x) {
    !is Int -> println("x is not integer")
    in 0..10 -> println("x is between 0 and 10")
    else -> println("x is over 10")}

看吧,我们可以在判断条件里用两种高级的表达式:

  • is 和 !is:判断值是否是某个类的实例;

  • in 和 !in:判断值是否在某个区间、数组和集合内;

我们还可以使用不带参数的 when 语句,在相当程度上替代类 C 语言中的 if - else if - else 语句。

 // 输入 xwhen {
    x !is Int -> println("x is not Int")
    (x and 1) == 0 -> println("x is even")
    else -> println("x is odd")}

是不是比一大堆 if - else if - else 简洁多了?

同样,我们也可以把 when 用作表达式:

 // 输入 xval isOdd = when {
    (x and 1) == 1 -> true
    else -> false}

与 if 语句用作表达式时的要求一致,when 语句用作表达式时必须有 else 部分,否则会出现编译错误。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章