if, when, while
if 條件運算子
1
2
3
val b: Any = 1
val res3: Boolean = if (b == 1) true else false
println("res3:$res3")
res3:true
if 接收傳回值
什麼時候會判斷if是要有傳回值的?
拿變數去接收它會自動判斷if是要去獲取傳回值的。
但一定要帶上else,因為它要判斷如果if條件不相等,要帶上其它值。
不用有return,預設程式碼區塊{}的最後一行是傳回值。
1
2
3
4
5
6
7
8
9
val b: Any = 1
val res: Int = if (b == 1) {
3
} else if (b == 3) {
1
} else {
2
}
println(res) // 3
1
2
3
4
5
6
7
8
9
val count = 42
val answerString: String = if (count == 42) {
"I have the answer."
} else if (count > 35) {
"The answer is close."
} else {
"The answer eludes me."
}
println(answerString)
I have the answer.
if條件語句不只有一行,省略return
如果if條件語句內的程式碼不只一行,必須把結果放在最後一行,而且不可以加return。
使用if條件語句作為傳回值的時候,一定要有else區塊,確保有值,才能指派給變數
1
2
3
4
5
6
7
8
9
10
var a = 3
val b = 9
val chooseMax = if (a > b) {
println("a最大")
a //結果值放在最後一行,不要加return
} else {
println("b最大")
b
}
println("chooseMax = $chooseMax")
b最大
chooseMax = 9
when
程式碼區塊
when每個程式碼區塊{}是用 -> 箭頭指向程式碼區塊{},預設程式碼區塊{}的最後一行是傳回值。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
val str: Any = "abc"
when(str) {
// 判斷b == 1 or b== 2,可以寫在同一排
1, 2 -> {
println("是1")
}
// 要把c設成Any,就不會自動推導Int,若沒設Any,會有型別錯誤
is String -> {
println(" is str")
}
// 判斷是不是在1到10的區間中
in 1 .. 10 -> {
println(" 1 到 10 ")
}
else -> {
println("沒有東西")
}
}
如果只有一行,就不用寫花括號,if也是一樣。
1
2
3
4
5
6
7
8
9
val b:Any = 1
println(
when (b) {
1, 2 -> 2
is String -> 3
in 1 .. 10 -> 4
else -> 5
}
)
2
when的條件判斷不會像java的switch自動向下執行,所以不必使用break來終止。
當if - else條件過多時,建議改用when。
注意x變數的類型是Any。
1
2
3
4
5
6
7
8
9
10
11
12
13
var x: Any = 1
when {
// x 等於1的時候執行,箭頭表示符合時要如何處理
x == 1 -> println("x 是 1")
// x 等於2,3或者等於4的時候
x == 2 || x == 3 || x == 4 -> println("x 可能是2 3 4")
// x 在 5-10 的時候執行
x in 5 .. 10 -> println("x 在 5-10 的時候執行")
// x 是 int的類型
x is Int -> println("x是整數")
// 其它情況
else -> println("無法判斷")
}
x 是 1
把x放在when的參數裡。
1
2
3
4
5
6
7
8
9
var x: Any = 1
when (x) {
1 -> println("x 是 1")
2, 3, 4 -> println("x 可能是2 3 4")
in 5 .. 10 -> println("x 在 5-10 的時候執行")
is Int -> println("x是整數")
else -> println("無法判斷")
// 如果所有可能條件都列出時,可以省略else
}
x 是 1
拿message變數去接收when。
1
2
3
4
5
6
7
8
9
10
11
var x: Any = 1
val message = when(x) {
1 -> println("x 是 1")
2, 3, 4 -> println("x 可能是2 3 4")
in 5 .. 10 -> println("x 在 5-10 的時候執行")
is Int -> println("x是整數")
else -> {
// 可以寫很多東西,要記得把結果放在最後一行
println("無法判斷")
}
}
x 是 1
拿變數去接收條件語句會自動判斷when是要去獲取傳回值的。
但一定要有else,若之前的條件都不滿足,要有個else取得默認的傳回值。
注意,b變數是Any類型,預設程式碼區塊{}的最後一行是傳回值。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
val b: Any = 1
val res2 = when(b) {
// 判斷b == 1 or b== 2,可以寫在同一排
1, 2 -> {
2
}
// 要把b設成Any,就不會自動推導Int,若沒設Any,會有型別錯誤
is String -> {
3
}
// 判斷是不是在1到10的區間中
in 1 .. 10 -> {
4
}
else -> {
5
}
}
println(res2) // 2
for
continue
1
2
3
4
5
//跳過4
for (i in 1..10) {
if (i == 4) continue
println(i)
}
1
2
3
5
6
7
8
9
10
break
1
2
3
4
for (i in 1..10) {
if (i == 5) break;
println(i)
}
1
2
3
4
foreach
1
2
3
(0 .. 5).forEach {
println(it)
}
0
1
2
3
4
5
repeat
重覆執行某段程式碼一定的次數
1
2
3
repeat(3) {
println("hello")
}
hello
hello
hello
while
1
2
3
4
5
var i = 0
while (i < 6) {
println(i)
i++
}
0
1
2
3
4
5
1
2
i = 0
while (i < 6) println(i++)
0
1
2
3
4
5
加1放在前面表示先加1再加上自己
1
2
i = 0
while (i < 6) println(++i)
1
2
3
4
5
6
即使條件不滿足,也至少執行一次
1
2
3
4
5
i = 6
do {
println(i)
i++
} while (i < 6)
6
標籤\@
某些情況下想離開外面的那個迴圈
break標籤\@
標籤名稱@ 指定要跳離的迴圈
1
2
3
4
5
6
7
8
9
10
11
i = 0
abc@ do {
println("out loop $i")
i++
var j = 0
while (j < 3) {
println("-- in loop $j")
j++
break@abc
}
} while (i < 6)
out loop 0
-- in loop 0
外迴圈、內迴圈只跑一次
continue標籤\@
1
2
3
4
5
6
7
8
9
10
11
i = 0
outer@ do {
println("out loop $i")
i++
var j = 0
while (j < 3) {
println("-- in loop $j")
j++
continue@outer
}
} while (i < 6)
out loop 0
-- in loop 0
out loop 1
-- in loop 0
out loop 2
-- in loop 0
out loop 3
-- in loop 0
out loop 4
-- in loop 0
out loop 5
-- in loop 0
外迴圈跑6遍,內迴圈參與一次
return標籤\@
類似continue功能。
不要印出2,遇到2就continue下一個for loop,其它的都要印。
1
2
3
4
5
(0 .. 10).forEach b@{
if(it == 2)
return@b
println(it)
}
1
3
4
5
6
7
8
9
10
以上沒有印2
run標籤\@
跳離forEach
要跳出整個foreach如何使用?使用run, run也是lambda ,結束run這個循環在run的循環加上標注
1
2
3
4
5
6
7
run c@{
(0 .. 10).forEach {
if(it == 2)
return@c
println(it)
}
}
0
1
return
return 會跳離迴圈最接近的函式。
不管是否為巢狀迴圈,永遠會跳離最接近的函式。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
fun foo(){
for (i in 0..1) {
println("for i start: $i")
for (j in 0 .. 3) {
println("for j start: $j")
if (j == 2) {
println("out foo()")
return
}
println("for j finish: $j")
}
println("for i finish $i")
}
println("finish foo()")
}
foo()
for i start: 0
for j start: 0
for j finish: 0
for j start: 1
for j finish: 1
for j start: 2
out foo()