分支
Kotlin提供if
和when
控制程式流程的語法。
根據不同的條件或範圍決定要執行哪一個分支的程式碼。
if expression
if-else
語法,讓程式可以根據Boolean_Expression
是否為真,決定要執行哪一個分支的程式碼區塊。
if-else陳述句(statement)
if (Boolean_Expression_1) {
// executed_codes
}
else if (Boolean_Expression_2) {
// executed_codes
}
else if (Boolean_Expression_N) {
// executed_codes
}
else {
// executed_codes
}
Boolean_Expression
:回傳值true
或false
的表達式。if (Boolean_Expression_1)
:檢查Boolean_Expression_1
的值是否為true
,如果為true
,則執行大括號{}
內的程式碼。else if (Boolean_Expression_N)
:如果前面的if
或else if
的條件都是false
,則檢查當前else if
的Boolean_Expression_N
的值是否為true
,如果為true
,則執行對應的大括號{}
內的程式碼。else if
條件可省略,如果不需要可以不用提供。else
:如果所有的if
和else if
條件都不滿足,則執行else
大括號{}
內的程式碼。else
可省略,如果不需要可以不用提供。- 如果
executed_codes
只有一行,可以省略大括號{}
。
Example
var max = a
if (a < b) max = b
// With else
if (a > b) {
max = a
} else {
max = b
}
if-else表達式(expression)
在Kotlin中,if-else
語法除了跟其他語言一樣是陳述句外,if-else
還可以當作表達式返回值使用。
因此Kotlin不像其他程式語言,它不需要三元運算子(condition ? then : else
),因為有返回值的if-else
表達式可以取代這個角色。
當表達式使用時:
- 返回值:大括號
{}
的最後一行即為返回值。(如果只有一行,那一行即為返回值) else
:不可省略,必須包含else
分支,保證if
表達式都能返回一個值。
Example
下面範例是if-else
當表達式使用來賦值給變數max
。
var max = a
// As expression with one line
max = if (a > b) a else b
// As expression with multiple line
val max = if (a > b) {
print("Choose a")
a // return a
} else {
print("Choose b")
b // return b
}
// use `else if` in expressions
val maxLimit = 1
val maxOrLimit = if (maxLimit > a) maxLimit else if (a > b) a else b
when expression
Kotlin使用when
表達式處理多個分支的情況,它允許你根據一個變量或表達式的值而執行對應的程式碼區塊。if-else
可以做到的,when
也都可以做到,但是在處理兩個以上條件分支時,它可比if-else
更簡潔和容易閱讀。
Kotlin沒有switch
語句,它使用when
取代一般程式語言的switch
多分支語句。
when陳述句
when
的基本語法如下:
when (subject) {
value1 -> {
//executed_codes
}
value2, value3 -> {
//executed_codes
}
in range -> {
//executed_codes
}
!in range -> {
//executed_codes
}
is Type -> {
//executed_codes
}
!is Type -> {
//executed_codes
}
else -> {
//executed_codes
}
}
subject
是你要檢查的變量或表達式。value1
:如果subject
的值是value1
,則執行對應{}
內的程式碼。value2, value3
:如果subject
的值是value2
或value3
,則執行對應{}
內的程式碼。in range
:range
是一個範圍,如果subject
的值,落在這個範圍內,則執行對應{}
內的程式碼。!in range
:range
是一個範圍,如果subject
的值,不落在這個範圍內,則執行對應{}
內的程式碼。is Type
:Type
是一個類型,如果subject
的值是這個類型,則執行對應{}
內的程式碼。!is Type
:Type
是一個類型,如果subject
的值不是這個類型,則執行對應{}
內的程式碼。else
:可省略。如果有提供,當沒有任何其他分支條件成立時,則執行對應{}
內的程式碼。- 如果
executed_codes
只有一行,可以省略大括號{}
。
Example
when (x) {
in 1..10 -> println("x is in the range")
in validNumbers -> println("x is in the valid numbers")
!in 10..20 -> println("x is outside the range")
else -> println("none of the above")
}
when (x) {
is Int -> println("x is an Int")
is String -> println(x.length)
else -> println("x is neither an Int nor a String")
}
when表達式
在Kotlin中,when
還可以當作表達式返回值使用。
when
作為表達式使用時:
- 返回值:分支的大括號
{}
的最後一行即為返回值。(如果只有一行,那一行即為返回值) else
:- 如果所有分支的條件無法包含
subject
所有可能的值,則else
分支是必要的。 - 除非所有分支的條件可以包含
subject
所有可能的值,則else
分支可以不用。
- 如果所有分支的條件無法包含
Example
enum class Bit {
ZERO, ONE
}
val numericValue = when (getRandomBit()) {
Bit.ZERO -> 0
Bit.ONE -> 1
// 'else' is not required because all cases are covered
}
不帶變量的when
when
可以不帶subject
使用。
不帶subject
時,每個分支條件會視為Boolean_Expression
回傳為true
或false
,等同if
–else
if
。
Example
when {
x.isOdd() -> print("x is odd")
y.isEven() -> print("y is even")
else -> print("x+y is odd")
}
使用when的區域變量
在Kotlin中,可以將when
的subjectExpression
賦值到variable
變量中,這允許你在when
的各個分支中重複使用該變量。這種做法特別有用於當需要重複使用subjectExpression
的結果時。
Example
when(val tmp = "A"+"B"){
"AA" -> println(tmp) //AB
"AB" -> println(tmp+"C") //print ABC
}