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 部分,否则会出现编译错误。