Kotlin 的流程控制,咱们分为两部分来介绍,第一部分是条件语句,第二部分是循环语句。今天咱们首先看一下 Kotlin 中的条件语句:java
做为一门更加现代的编程语言,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,咱们能把逻辑写得清清楚楚,让代码变得简洁清晰:app
// 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 部分:ide
咱们val a = 1val b = 0val max = if (a <= b) b看一下上面的语句,由于 a <= b 的结果为 false,因此代码并不会执行到将 b 赋给 max 的部分,max 其实是 null, 这时咱们再执行其余语句就会出现错误。Kotlin 为避免出现这样的问题,在编译时就要求,做为表达式使用的 if 语句,必需要有 else 语句与之搭配,不然就会出现编译错误。函数
在初学 C 和 Java 的 switch 语句时,我被它坑得不浅,用几个布尔表达式做为选择分支的条件,结果天然是编译错误。仔细查看语法规范才明白,C 的 switch 语句只能把整数常量做为判断条件,Java 的选择大一点,却也只扩大到整数的封装类、字符串和枚举,一旦加入一点复杂的逻辑,咱们就得用成堆的 if - else 语句,难道咱们就不能把布尔表达式做为判断分支的条件吗?Kotlin 作到了这一点。spa
Kotlin 使用 when 语句替代类 C 语言中的 switch 语句,但它比 switch 更增强大。orm
首先,switch 能作的,when 也能作:ci
// 输入 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 部分,不然会出现编译错误。