前面幾天大致上把基礎的型別、變數與資料結構講了一遍,接下來我們即將進入全新段落!
今天以控制流程開頭,內容將涵蓋 if-else
, when
。
最常見也最值觀的流程控制,如果 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
談完 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-case
的 break
。
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")
}