流程控制:條件語句

Kotlin 的流程控制,咱們分爲兩部分來介紹,第一部分是條件語句,第二部分是循環語句。今天咱們首先看一下 Kotlin 中的條件語句:java

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,咱們能把邏輯寫得清清楚楚,讓代碼變得簡潔清晰: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 語句與之搭配,不然就會出現編譯錯誤。函數

2. when 條件選擇語句

在初學 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 部分,不然會出現編譯錯誤。

相關文章
相關標籤/搜索