iT邦幫忙

2023 iThome 鐵人賽

DAY 11
0
Software Development

成為一名 Kotlin 後端攻城獅系列 第 11

Day 11 Kotlin 控制流程 (1)

  • 分享至 

  • xImage
  •  

前面幾天大致上把基礎的型別、變數與資料結構講了一遍,接下來我們即將進入全新段落!

https://ithelp.ithome.com.tw/upload/images/20230926/20119910ra7T6s95gP.png

今天以控制流程開頭,內容將涵蓋 if-else, when

If-else

最常見也最值觀的流程控制,如果 if 內的邏輯成立,則執行下方段落程式碼,若不成立則執行 else 的段落。

val doSomething = true
if ( doSomething ) {
    println("Do something") 
} else {
    println("Do nothing")
}

接下來我們來看一些比較特別的寫法,下方這個是用於判斷傳入值 dayOfIronMan 是否落在一定範圍內:

val dayOfIronMan = 11
if (dayOfIronMan in 1..29) {
    println("加油 你還剩下 ${30-dayOfIronMan} 天")
}

其實他的邏輯等效於下方寫法,如果要使用常見的 <, >, =, !, &&, || 寫法的

val dayOfIronMan = 11
if (1 <= dayOfIronMan && dayOfIronMan <= 29) {
    println("加油 你還剩下 ${30-dayOfIronMan} 天")
}

當然 Kotlin 也如同多數程式語言提供 else If 寫法

val dayOfIronMan = 11
if (dayOfIronMan in 1..29) {
    println("加油 你還剩下 ${30-dayOfIronMan} 天")
} else if (dayOfIronMan == 30) {
		println("恭喜完賽")
} else {
		println("你的參賽日期怪怪的喔!")
}

如果你是一位想要極力壓地 LOC (Lines of code) 的魔人,Kotlin 當然沒有忘記你(?) 也提供了當行或是更為簡略的 if-else 寫法

val a = 9
val b = 26
var max = a        // max = 9
if (a < b) max = b // max = 26

// 上方兩行等效於 max = if (a > b) a lse b

When

談完 if-else 後我們來看 when,他其實就是其他語言中的 switch-case 用法,在未來提到 arrow-kt 時很常被用來取代無限的 if-else 堆疊。

when (dayOfIronMan) {
    0  -> println("你還沒開賽喔!但快要開始了~ 加油")               // case 0
    in 1..29 -> println("持續努力加油,你還有 ${30-dayOfIronMan}") // case 1~29
    30 -> println("恭喜完賽")                                     // case 30
    else -> println("你活錯平行時空囉!")                            
            // default (error) case
}

除了直接 print 出結果外,我們也可以用 when 來回傳值:

fun getRandomBit(): Bit {
	// do something to return a `Bit` type
}

enum class Bit {
    ZERO, ONE
}

val numericValue = when (getRandomBit()) {
    Bit.ZERO -> 0
    Bit.ONE -> 1
    // 'else' is not required because all cases are covered
}

從上面的例子,我們發現一件事,為什麼他不需要標記 else 的情況呢?這是因為前面我們就定義了 Bit 這個型別只會有兩種情況 ZERO 或是 ONE,也因為不會有其他可能 (概念同所有情境皆已被窮舉出來) ,所以 Kotlin compiler 並不會要求 programmer 列出 else 情境。

這也是後面當用在更複雜的系統時會優先使用 when 取代 if-else 的原因,因為他可以在編譯階段 (部分 IDE 甚至會即時提醒) 就幫我們找出錯誤,避免錯誤在系統跑測試階段或是實際上線給其他人用的時候才發現。

我們也可以不給 when 傳入參數,那們他會直接變成布林判斷式,需要注意,這樣的寫法會讓同時符合條件時優先執行放在前面的條件 (觀念同於 when 裡面每一行結果都存在 switch-casebreak

val x = 9
val y = 12

when {
    x.isOdd() -> print("x is odd")    // Only this line will be printed
    y.isEven() -> print("y is even")
    else -> print("x+y is odd")
}

上一篇
Day 10 Kotlin 資料結構-集合 Final
下一篇
Day 12 Kotlin 控制流程 (2) - 迴圈
系列文
成為一名 Kotlin 後端攻城獅30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言