Kotlin-簡(jiǎn)約之美-進(jìn)階篇(二):when的使用詳解

提到 when,大家都會(huì)聯(lián)想到 Java 中的 switch燃领,然而在 kotlin 中士聪,when 顯然比 Java 中的 switch 要強(qiáng)大得多。首先猛蔽,我們先來看看 when 的特點(diǎn):

  • 它可以作為表達(dá)式使用
  • 使用更加安全
  • 強(qiáng)大靈活的分支結(jié)構(gòu)
  • 可以不帶參數(shù)
    接下來剥悟,我來帶大家逐步領(lǐng)略這些特點(diǎn)。以下面這段 Java 功能代碼為例:
switch(animal) {
    case EAGLE:
        System.out.println("鳥類");
        break;
    case DOLPHIN:
        System.out.println("獸類");
        break;
    case LOCUST:
        System.out.println("昆蟲類");
        break;
    case CARP:
        System.out.println("魚類");
        break;
    case TIGER:
        System.out.println("獸類");
        break;
    case DUCK:
        System.out.println("鳥類");
        break;
    default:
        System.out.println("未知?jiǎng)游?);
        break;
}

從以上代碼可以看出曼库,我們這里實(shí)現(xiàn)的功能是:通過用戶輸入一個(gè)動(dòng)物名稱來得到其對(duì)應(yīng)的種類信息区岗。乍一看,你可能會(huì)覺得上面的代碼再正常不過毁枯,但是倘若我們的輸入情形很多的話慈缔,就會(huì)增加密密麻麻的限制條件,這肯定是我們不想看到的种玛。那么藐鹤,讓我們來看看通過 Kotlin 的 when 表達(dá)式如何實(shí)現(xiàn)相同功能:

when(animal) {
    EAGLE, DUCK -> println("鳥類")
    DOLPHIN, TIGER -> println("獸類")
    CARP -> println("魚類")
    LOCUST -> println("昆蟲類")
    else -> println("未知?jiǎng)游?)
}

OK,以上就是該功能代碼的 kotlin 實(shí)現(xiàn)方式赂韵,代碼不僅簡(jiǎn)化了很多娱节,也省去了大量的 break 語句,避免了 Java 中因遺漏 break 而導(dǎo)致的 bug右锨,增強(qiáng)了安全性括堤。如果匹配成功,對(duì)應(yīng)的分支便會(huì)執(zhí)行绍移,同時(shí)也可以把多個(gè)情況合并到同一個(gè)分支悄窃,只需要通過逗號(hào)隔開,并沒有額外的代碼蹂窖。

PS:每個(gè)條件分支的處理通過在 -> 之后來進(jìn)行轧抗。

作為表達(dá)式使用

首先,我們需要重溫一下表達(dá)式與語句的區(qū)別瞬测。表達(dá)式有值横媚,并能作為另一個(gè)表達(dá)式的一部分來使用;而語句沒有返回值月趟。Java 中的控制結(jié)構(gòu)皆為語句灯蝴。而在 Kotlin 中,除了循環(huán)體結(jié)構(gòu)外孝宗,大多數(shù)控制結(jié)構(gòu)都是表達(dá)式穷躁。舉個(gè)栗子??,還是上面的例子因妇,我們可以將其優(yōu)化為以下代碼:

var result = when(animal) {
    EAGLE, DUCK -> "鳥類"
    DOLPHIN, TIGER -> "獸類"
    CARP -> "魚類"
    LOCUST -> "昆蟲類"
    else -> "未知?jiǎng)游?
}
// 輸入:DUCK问潭,返回:當(dāng)前動(dòng)物的種類為:鳥類
println("當(dāng)前動(dòng)物的種類為: $result")

此外,我們也可以直接通過表達(dá)式函數(shù)來直接得到最終的結(jié)果:

fun displayAnimalType(animal: Animal) =
            when(animal) {
                Animal.EAGLE, Animal.DUCK -> "鳥類"
                Animal.DOLPHIN, Animal.TIGER -> "獸類"
                Animal.CARP -> "魚類"
                Animal.LOCUST -> "昆蟲類"
                else -> "未知?jiǎng)游?
  }

強(qiáng)大靈活的分支

Kotlin 中的 when 遠(yuǎn)比 Java 當(dāng)中的 switch 要強(qiáng)大得多婚被。switch 只能以常量作為分支條件狡忙,而 when 允許使用任意對(duì)象。emmm~舉個(gè)簡(jiǎn)單的例子吧:

fun handleResult(score: Int) =
            when(score) {
                in 0..39 -> "fail to go up to the next grade."
                in 40 until 60 -> "not pass, should test again."
                97,98,99,100 -> "learning outstanding results."
                else -> "pass the test."
            }

Java 當(dāng)中址芯,當(dāng)我們的分支情況比較多或者每種分支可能會(huì)重復(fù)多次時(shí)灾茁,勢(shì)必會(huì)通過 if-else 來各種判斷,而在 Kotlin 當(dāng)中谷炸,一個(gè) when 就能幫我們完成這些操作删顶。
此外,如果你想判斷一個(gè)未知變量的類型淑廊,而其可能類型有很多種可能性逗余,那么也可以通過 when 來實(shí)現(xiàn),例如:

fun judgeAnimalKind(animal: Any) =
            when(animal) {
                is Bird -> "這是鳥類"
                is Fish -> "這是魚類"
                judgeIfInsect(animal) -> "這是昆蟲"
                else -> "我不知道這是什么動(dòng)物"
}

當(dāng)然季惩,我們也可以將代碼塊作為我們的分支體录粱,這時(shí)候,代碼塊中最后一個(gè)表達(dá)式或者變量就是該分支體的返回結(jié)果画拾,如:

fun judgeAnimalKind(animal: Any) =
            when(animal) {
                is Bird -> "這是鳥類"
                is Fish -> "這是魚類"
                judgeIfInsect(animal) -> "這是昆蟲"
                else -> {
                    val kind = if (judgeDolphin(animal) || judgeTiger(animal)) {
                        "這是獸類"
                    }else {
                        "我不知道這是什么動(dòng)物"
                    }
                    kind
                }
            }

上述代碼中啥繁,kind 即為我們的 else 分支塊中的最終返回結(jié)果。

無參的情況

特別地青抛,when 中的參數(shù)可能并非滿足我們的需求旗闽,我們可以選擇省略該參數(shù),例如這樣:

when {
    phoneNumber?.length != 11 -> toast("illegal phone number.")
    password.isNullOrEmpty() -> toast("please input password")
}

總結(jié)

通過以上的介紹,我們不難發(fā)現(xiàn):when 的使用場(chǎng)景要比 Java 的 switch 靈活适室、強(qiáng)大的多嫡意,同時(shí),我們也可以借助 when 來重構(gòu)和優(yōu)化復(fù)雜的 if-else 結(jié)構(gòu)捣辆,以簡(jiǎn)化我們的代碼蔬螟,提高代碼的可讀性。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末汽畴,一起剝皮案震驚了整個(gè)濱河市旧巾,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌忍些,老刑警劉巖鲁猩,帶你破解...
    沈念sama閱讀 206,311評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異罢坝,居然都是意外死亡廓握,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門炸客,熙熙樓的掌柜王于貴愁眉苦臉地迎上來疾棵,“玉大人,你說我怎么就攤上這事痹仙∈嵌” “怎么了?”我有些...
    開封第一講書人閱讀 152,671評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵开仰,是天一觀的道長拟枚。 經(jīng)常有香客問我,道長众弓,這世上最難降的妖魔是什么恩溅? 我笑而不...
    開封第一講書人閱讀 55,252評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮谓娃,結(jié)果婚禮上脚乡,老公的妹妹穿的比我還像新娘。我一直安慰自己滨达,他們只是感情好奶稠,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,253評(píng)論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著捡遍,像睡著了一般锌订。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上画株,一...
    開封第一講書人閱讀 49,031評(píng)論 1 285
  • 那天辆飘,我揣著相機(jī)與錄音啦辐,去河邊找鬼。 笑死蜈项,一個(gè)胖子當(dāng)著我的面吹牛芹关,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播战得,決...
    沈念sama閱讀 38,340評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼充边,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼庸推!你這毒婦竟也來了常侦?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,973評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤贬媒,失蹤者是張志新(化名)和其女友劉穎聋亡,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體际乘,經(jīng)...
    沈念sama閱讀 43,466評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡坡倔,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,937評(píng)論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了脖含。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片罪塔。...
    茶點(diǎn)故事閱讀 38,039評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖养葵,靈堂內(nèi)的尸體忽然破棺而出征堪,到底是詐尸還是另有隱情,我是刑警寧澤关拒,帶...
    沈念sama閱讀 33,701評(píng)論 4 323
  • 正文 年R本政府宣布佃蚜,位于F島的核電站,受9級(jí)特大地震影響着绊,放射性物質(zhì)發(fā)生泄漏谐算。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,254評(píng)論 3 307
  • 文/蒙蒙 一归露、第九天 我趴在偏房一處隱蔽的房頂上張望洲脂。 院中可真熱鬧,春花似錦剧包、人聲如沸恐锦。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽踩蔚。三九已至,卻和暖如春枚粘,著一層夾襖步出監(jiān)牢的瞬間馅闽,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留福也,地道東北人局骤。 一個(gè)月前我還...
    沈念sama閱讀 45,497評(píng)論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像暴凑,于是被迫代替她去往敵國和親峦甩。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,786評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容