控制流程
就像其他程式語言一樣,Kotlin 能夠根據一段程式碼是否評估為真來做出決策。這類程式碼稱為條件表達式。Kotlin 也支援建立和迭代迴圈。
條件表達式
Kotlin 提供了 if
和 when
來檢查條件表達式。
如果您必須在
if
和when
之間做選擇,我們建議使用when
,因為它:
- 讓您的程式碼更容易閱讀。
- 讓添加其他分支更容易。
- 減少程式碼中的錯誤。
If
要使用 if
,請將條件表達式置於圓括號 ()
內,並將結果為真時要執行的動作置於花括號 {}
內:
fun main() {
val d: Int
val check = true
if (check) {
d = 1
} else {
d = 2
}
println(d)
// 1
}
Kotlin 中沒有三元運算子 condition ? then : else
。相反地,if
可以作為表達式使用。如果每個動作只有一行程式碼,則花括號 {}
是可選的:
fun main() {
val a = 1
val b = 2
println(if (a > b) a else b) // 返回值:2
}
When
當您有多個分支的條件表達式時,請使用 when
。
要使用 when
:
- 將您要評估的值置於圓括號
()
內。 - 將分支置於花括號
{}
內。 - 在每個分支中使用
->
,將每個檢查與檢查成功時要執行的動作分開。
when
可以用作陳述式或表達式。陳述式不返回任何內容,而是執行動作。
以下是將 when
作為陳述式使用的範例:
fun main() {
val obj = "Hello"
when (obj) {
// 檢查 obj 是否等於 "1"
"1" -> println("One")
// 檢查 obj 是否等於 "Hello"
"Hello" -> println("Greeting")
// 預設陳述式
else -> println("Unknown")
}
// Greeting
}
請注意,所有分支條件都會依序檢查,直到其中一個條件符合為止。因此,只會執行第一個符合的分支。
表達式返回一個值,該值可以在您的程式碼中稍後使用。
以下是將 when
作為表達式使用的範例。when
表達式會立即指派給一個變數,該變數稍後會與 println()
函式一起使用:
fun main() {
val obj = "Hello"
val result = when (obj) {
// 如果 obj 等於 "1",將 result 設定為 "One"
"1" -> "One"
// 如果 obj 等於 "Hello",將 result 設定為 "Greeting"
"Hello" -> "Greeting"
// 如果先前的條件都不符合,將 result 設定為 "Unknown"
else -> "Unknown"
}
println(result)
// Greeting
}
到目前為止您所看到的 when
範例都帶有主語:obj
。但是 when
也可以在沒有主語的情況下使用。
此範例使用沒有主語的 when
表達式來檢查一連串布林表達式:
fun main() {
val trafficLightState = "Red" // 這可以是 "Green"、"Yellow" 或 "Red"
val trafficAction = when {
trafficLightState == "Green" -> "Go"
trafficLightState == "Yellow" -> "Slow down"
trafficLightState == "Red" -> "Stop"
else -> "Malfunction"
}
println(trafficAction)
// Stop
}
然而,您可以有相同的程式碼,但將 trafficLightState
作為主語:
fun main() {
val trafficLightState = "Red" // 這可以是 "Green"、"Yellow" 或 "Red"
val trafficAction = when (trafficLightState) {
"Green" -> "Go"
"Yellow" -> "Slow down"
"Red" -> "Stop"
else -> "Malfunction"
}
println(trafficAction)
// Stop
}
將 when
與主語一起使用,可以使您的程式碼更容易閱讀和維護。當您將主語與 when
表達式一起使用時,它還有助於 Kotlin 檢查是否涵蓋了所有可能的情況。否則,如果您在 when
表達式中不使用主語,則需要提供一個 else
分支。
條件表達式練習
練習 1
建立一個簡單的遊戲,如果擲出兩個骰子的點數相同則獲勝。使用 if
判斷骰子是否匹配,如果是則印出 You win :)
,否則印出 You lose :(
。
TIP
在此練習中,您將引入一個套件,以便可以使用 Random.nextInt()
函式來獲取一個隨機的 Int
。有關引入套件的更多資訊,請參閱套件與引入。
提示
==
) 來比較骰子結果。 import kotlin.random.Random
fun main() {
val firstResult = Random.nextInt(6)
val secondResult = Random.nextInt(6)
// 在此處編寫您的程式碼
}
範例解法
import kotlin.random.Random
fun main() {
val firstResult = Random.nextInt(6)
val secondResult = Random.nextInt(6)
if (firstResult == secondResult)
println("You win :)")
else
println("You lose :(")
}
練習 2
使用 when
表達式,更新以下程式,使其在輸入遊戲主機按鈕名稱時印出對應的動作。
按鈕 | 動作 |
---|---|
A | Yes |
B | No |
X | Menu |
Y | Nothing |
其他 | 沒有這個按鈕 |
|---|---|
fun main() {
val button = "A"
println(
// 在此處編寫您的程式碼
)
}
|---|---|
fun main() {
val button = "A"
println(
when (button) {
"A" -> "Yes"
"B" -> "No"
"X" -> "Menu"
"Y" -> "Nothing"
else -> "沒有這個按鈕"
}
)
}
範圍
在討論迴圈之前,了解如何構造供迴圈迭代的範圍會很有用。
在 Kotlin 中建立範圍最常見的方法是使用 ..
運算子。例如,1..4
等同於 1, 2, 3, 4
。
若要宣告不包含結束值的範圍,請使用 ..<
運算子。例如,1..<4
等同於 1, 2, 3
。
若要宣告反向順序的範圍,請使用 downTo
。例如,4 downTo 1
等同於 4, 3, 2, 1
。
若要宣告增量不是 1 的範圍,請使用 step
和您期望的增量值。例如,1..5 step 2
等同於 1, 3, 5
。
您也可以對 Char
範圍做同樣的事情:
'a'..'d'
等同於'a', 'b', 'c', 'd'
'z' downTo 's' step 2
等同於'z', 'x', 'v', 't'
迴圈
程式設計中兩種最常見的迴圈結構是 for
和 while
。使用 for
遍歷值範圍並執行動作。使用 while
繼續執行動作直到特定條件符合為止。
For
運用您對範圍的新知識,您可以建立一個 for
迴圈,該迴圈會遍歷數字 1 到 5,並每次都印出該數字。
將迭代器和範圍連同關鍵字 in
置於圓括號 ()
內。將您要完成的動作置於花括號 {}
內:
fun main() {
for (number in 1..5) {
// number 是迭代器,1..5 是範圍
print(number)
}
// 12345
}
集合也可以透過迴圈進行迭代:
fun main() {
val cakes = listOf("carrot", "cheese", "chocolate")
for (cake in cakes) {
println("好好吃,是個 $cake 蛋糕!")
}
// 好好吃,是紅蘿蔔蛋糕!
// 好好吃,是起司蛋糕!
// 好好吃,是巧克力蛋糕!
}
While
while
可以用兩種方式使用:
- 在條件表達式為真時執行程式碼區塊。(
while
) - 先執行程式碼區塊,然後再檢查條件表達式。(
do-while
)
在第一種使用情境 (while
) 中:
- 將
while
迴圈要繼續執行的條件表達式宣告在圓括號()
內。 - 將您要完成的動作加入花括號
{}
內。
以下範例使用遞增運算子
++
來遞增cakesEaten
變數的值。
fun main() {
var cakesEaten = 0
while (cakesEaten < 3) {
println("吃一個蛋糕")
cakesEaten++
}
// 吃一個蛋糕
// 吃一個蛋糕
// 吃一個蛋糕
}
在第二種使用情境 (do-while
) 中:
- 將
while
迴圈要繼續執行的條件表達式宣告在圓括號()
內。 - 使用關鍵字
do
,在花括號{}
內定義您要完成的動作。
fun main() {
var cakesEaten = 0
var cakesBaked = 0
while (cakesEaten < 3) {
println("吃一個蛋糕")
cakesEaten++
}
do {
println("烤一個蛋糕")
cakesBaked++
} while (cakesBaked < cakesEaten)
// 吃一個蛋糕
// 吃一個蛋糕
// 吃一個蛋糕
// 烤一個蛋糕
// 烤一個蛋糕
// 烤一個蛋糕
}
有關條件表達式和迴圈的更多資訊和範例,請參閱條件與迴圈。
既然您已了解 Kotlin 控制流程的基礎知識,是時候學習如何編寫您自己的函式了。
迴圈練習
練習 1
您有一個程式,它會計算披薩片數,直到湊成一個有 8 片的完整披薩。請以兩種方式重構此程式:
- 使用
while
迴圈。 - 使用
do-while
迴圈。
fun main() {
var pizzaSlices = 0
// 在此處開始重構
pizzaSlices++
println("這裡只有 $pizzaSlices 片披薩 :(")
pizzaSlices++
println("這裡只有 $pizzaSlices 片披薩 :(")
pizzaSlices++
println("這裡只有 $pizzaSlices 片披薩 :(")
pizzaSlices++
println("這裡只有 $pizzaSlices 片披薩 :(")
pizzaSlices++
println("這裡只有 $pizzaSlices 片披薩 :(")
pizzaSlices++
println("這裡只有 $pizzaSlices 片披薩 :(")
pizzaSlices++
println("這裡只有 $pizzaSlices 片披薩 :(")
pizzaSlices++
// 在此處結束重構
println("這裡有 $pizzaSlices 片披薩。太棒了!我們有一整個披薩了!:D")
}
範例解法 1
fun main() {
var pizzaSlices = 0
while ( pizzaSlices < 7 ) {
pizzaSlices++
println("這裡只有 $pizzaSlices 片披薩 :(")
}
pizzaSlices++
println("這裡有 $pizzaSlices 片披薩。太棒了!我們有一整個披薩了!:D")
}
範例解法 2
fun main() {
var pizzaSlices = 0
pizzaSlices++
do {
println("這裡只有 $pizzaSlices 片披薩 :(")
pizzaSlices++
} while ( pizzaSlices < 8 )
println("這裡有 $pizzaSlices 片披薩。太棒了!我們有一整個披薩了!:D")
}
練習 2
編寫一個模擬 Fizz buzz 遊戲的程式。您的任務是遞增地印出從 1 到 100 的數字,將任何可被三整除的數字替換為單詞 "fizz",將任何可被五整除的數字替換為單詞 "buzz"。任何可同時被 3 和 5 整除的數字必須替換為單詞 "fizzbuzz"。
提示 1
for
迴圈來計數,並使用 when
表達式來決定每一步要印出什麼。 提示 2
fun main() {
// 在此處編寫您的程式碼
}
範例解法
fun main() {
for (number in 1..100) {
println(
when {
number % 15 == 0 -> "fizzbuzz"
number % 3 == 0 -> "fizz"
number % 5 == 0 -> "buzz"
else -> "$number"
}
)
}
}
練習 3
您有一個單詞列表。使用 for
和 if
只印出以字母 l
開頭的單詞。
提示
String
型別的 .startsWith()
函式。 fun main() {
val words = listOf("dinosaur", "limousine", "magazine", "language")
// 在此處編寫您的程式碼
}
範例解法
fun main() {
val words = listOf("dinosaur", "limousine", "magazine", "language")
for (w in words) {
if (w.startsWith("l"))
println(w)
}
}