Kotlin學(xué)習(xí)(二):控制語(yǔ)句詳解篇
前言
通過上一篇的學(xué)習(xí),我們對(duì)kotlin已經(jīng)掌握了函數(shù)的定義,基本數(shù)據(jù)類型,null安全設(shè)計(jì),類型檢測(cè)及自動(dòng)轉(zhuǎn)換和Kotlin的區(qū)間表達(dá)式,如果您還有任何不明白的地方,請(qǐng)?zhí)D(zhuǎn)至我的上一篇博客:
《Kotlin學(xué)習(xí)(一):我TM謝謝你!(基礎(chǔ)語(yǔ)法篇)》
對(duì)于kotlin,這只是最基礎(chǔ)的入門講解,也希望大家能夠跟我一樣逐漸適應(yīng)kotlin的美,我們一起進(jìn)步,我相信通過一段時(shí)間的學(xué)習(xí),我也可以像大家分享一些kotlin的語(yǔ)法糖以及更深入的使用。我的博客(Power)
kotlin控制語(yǔ)句詳解
- 條件控制語(yǔ)句:if 語(yǔ)句、when 語(yǔ)句
- 循環(huán)控制語(yǔ)句:for 循環(huán)、while與do...while 循環(huán)
- 返回和跳轉(zhuǎn)語(yǔ)句:return、 break、 continue
1. if語(yǔ)句
kotlin的if表達(dá)式其實(shí)和java是非常類似的,唯一不同的地方在于kotlin可以把表達(dá)式的結(jié)果賦值給變量,類似于java的三元運(yùn)算符,我們可以直接實(shí)現(xiàn)。
// 傳統(tǒng)用法
var max = a
if (a < b) max = b
// 使用 else
var max: Int
if (a > b) {
max = a
} else {
max = b
}
// 作為表達(dá)式
val max = if (a > b) a else b
舉例:
fun main(args: Array<String>) {
var x = 0
if(x>0){
println("x 大于 0")
}else if(x==0){
println("x 等于 0")
}else{
println("x 小于 0")
}
var a = 1
var b = 2
val c = if (a>=b) a else b
println("c 的值為 $c")
}
//輸出結(jié)果為:
x 等于 0
c 的值為 2
2. when表達(dá)式
when 將它的參數(shù)和所有的分支條件順序比較,直到某個(gè)分支滿足條件。
when 既可以被當(dāng)做表達(dá)式使用也可以被當(dāng)做語(yǔ)句使用。如果它被當(dāng)做表達(dá)式,符合條件的分支的值就是整個(gè)表達(dá)式的值,如果當(dāng)做語(yǔ)句使用, 則忽略個(gè)別分支的值。
我們看下例子:
//在 when 中,else 同 switch 的 default。如果其他分支都不滿足條件將會(huì)求值 else 分支
when (x) {
1 -> print("x == 1")
2 -> print("x == 2")
else -> { // 注意這個(gè)塊,else 相當(dāng)于 switch 的 default
print("x 不是 1 ,也不是 2")
}
}
//如果很多分支需要用相同的方式處理,則可以把多個(gè)分支條件放在一起,用逗號(hào)分隔
when (x) {
0, 1 -> print("x == 0 or x == 1")
else -> print("otherwise")
}
//我們也可以檢測(cè)一個(gè)值在(in)或者不在(!in)一個(gè)區(qū)間或者集合中
when (x) {
in 1..10 -> print("x is in the range")
in validNumbers -> print("x is valid")
!in 10..20 -> print("x is outside the range")
else -> print("none of the above")
}
//另一種可能性是檢測(cè)一個(gè)值是(is)或者不是(!is)一個(gè)特定類型的值。注意: 由于智能轉(zhuǎn)換,你可以訪問該類型的方法和屬性而無(wú)需 任何額外的檢測(cè)
fun hasPrefix(x: Any) = when(x) {
is String -> x.startsWith("prefix")
else -> false
}
//when 也可以用來(lái)取代 if-else if鏈。 如果不提供參數(shù),所有的分支條件都是簡(jiǎn)單的布爾表達(dá)式,而當(dāng)一個(gè)分支的條件為真時(shí)則執(zhí)行該分支
when {
x.isOdd() -> print("x is odd")
x.isEven() -> print("x is even")
else -> print("x is funny")
}
//when 中使用 in 運(yùn)算符來(lái)判斷集合內(nèi)是否包含某實(shí)例
fun main(args: Array<String>) {
val items = setOf("apple", "banana", "kiwi")
when {
"orange" in items -> println("juicy")
"apple" in items -> println("apple is fine too")
}
}
舉例:
fun main(args: Array<String>) {
var x = 0
when (x) {
0, 1 -> println("x == 0 or x == 1")
else -> println("otherwise")
}
when (x) {
1 -> println("x == 1")
2 -> println("x == 2")
else -> { // 注意這個(gè)塊
println("x 不是 1 ,也不是 2")
}
}
when (x) {
in 0..10 -> println("x 在該區(qū)間范圍內(nèi)")
else -> println("x 不在該區(qū)間范圍內(nèi)")
}
}
//輸出結(jié)果:
x == 0 or x == 1
x 不是 1 ,也不是 2
x 在該區(qū)間范圍內(nèi)
3. for循環(huán)
- for 循環(huán)可以對(duì)任何提供迭代器(iterator)的對(duì)象進(jìn)行遍歷
- kotlin 廢除了 java 的
for(int i = 0; i < list.size(); i++)規(guī)則,新增了其他的規(guī)則,來(lái)滿足對(duì)數(shù)組或集合的遍歷 - 循環(huán)數(shù)組會(huì)編譯成優(yōu)化的實(shí)現(xiàn)而不會(huì)創(chuàng)建額外對(duì)象,或者你可以用庫(kù)函數(shù) withIndex:
//for循環(huán)可以對(duì)任何提供迭代器(iterator)的對(duì)象進(jìn)行遍歷
for (item in collection) print(item)
for (item: Int in ints) {
// ……
}
//如果你想要通過索引遍歷一個(gè)數(shù)組或者一個(gè) list
for (i in array.indices) {
print(array[i])
}
//循環(huán)數(shù)組會(huì)編譯成優(yōu)化的實(shí)現(xiàn)而不會(huì)創(chuàng)建額外對(duì)象,或者你可以用庫(kù)函數(shù) withIndex:
for ((index, value) in array.withIndex()) {
println("the element at $index is $value")
}
舉例:
// 循環(huán)5次,且步長(zhǎng)為1的遞增
for (i in 0 until 5){
print("i => $i \t")
}
// 循環(huán)5次,且步長(zhǎng)為1的遞減
for (i in 15 downTo 11){
print("i => $i \t")
}
print("使用 符號(hào)`..`的打印結(jié)果\n")
for (i in 20 .. 25){
print("i => $i \t")
}
print("使用until的打印結(jié)果\n")
for (i in 20 until 25){
print("i => $i \t")
}
//輸出結(jié)果:
使用 符號(hào)`..`的打印結(jié)果
i => 20 i => 21 i => 22 i => 23 i => 24 i => 25
使用until的打印結(jié)果
i => 20 i => 21 i => 22 i => 23 i => 24
//使用數(shù)組的indices屬性遍歷
var arrayListTwo = arrayOf(1,3,5,7,9)
for (i in arrayListTwo.indices){
println("arrayListTwo[$i] => " + arrayListTwo[i])
}
//輸出結(jié)果:
arrayListTwo[0] => 1
arrayListTwo[1] => 3
arrayListTwo[2] => 5
arrayListTwo[3] => 7
arrayListTwo[4] => 9
//使用數(shù)組的withIndex()方法遍歷
var arrayListTwo = arrayOf(1,3,5,7,9)
for ((index,value) in arrayListTwo.withIndex()){
println("index => $index \t value => $value")
}
//輸出結(jié)果:
index => 0 value => 1
index => 1 value => 3
index => 2 value => 5
index => 3 value => 7
index => 4 value => 9
4. while, do...while語(yǔ)句
kotlin的while語(yǔ)句和java的while語(yǔ)句一樣,下面我們直接舉栗:
var num = 5
var count = 1
while (num < 10){
println("num => $num")
println("循環(huán)了$count 次")
count++
num++
}
//輸出結(jié)果:
num => 5
循環(huán)了1 次
num => 6
循環(huán)了2 次
num => 7
循環(huán)了3 次
num => 8
循環(huán)了4 次
num => 9
循環(huán)了5 次
//do...while語(yǔ)句
var num = 5
var count = 1
do {
println("num => $num")
println("循環(huán)了$count 次")
count++
num++
}while (num < 10)
//輸出結(jié)果:
num => 5
循環(huán)了1 次
num => 6
循環(huán)了2 次
num => 7
循環(huán)了3 次
num => 8
循環(huán)了4 次
num => 9
循環(huán)了5 次
// *注* : do{...}while(exp)與while(exp){...}最大的區(qū)別是do{...}while(exp)最少執(zhí)行一次,這點(diǎn)也是和Java相同的
5. 返回和跳轉(zhuǎn)語(yǔ)句
return、break、continue的用法和java是一樣的,
- eturn。默認(rèn)從最直接包圍它的函數(shù)或者匿名函數(shù)返回
- break。終止最直接包圍它的循環(huán)
- continue。繼續(xù)下一次最直接包圍它的循環(huán)
我們直接看代碼吧:
fun main(args: Array<String>) {
for (i in 1..10) {
if (i==3) continue // i 為 3 時(shí)跳過當(dāng)前循環(huán),繼續(xù)下一次循環(huán)
println(i)
if (i>5) break // i 為 6 時(shí) 跳出循環(huán)
}
}
//輸出結(jié)果為:1 2 4 5 6
fun returnExample(){
var str: String = ""
if (str.isBlank()){
println("我退出了該方法")
return
}
}
//輸出結(jié)果為:我退出了該方法
- Break 和 Continue 標(biāo)簽
在 Kotlin 中任何表達(dá)式都可以用標(biāo)簽(label)來(lái)標(biāo)記。 標(biāo)簽的格式為標(biāo)識(shí)符后跟 @ 符號(hào),例如:abc@、fooBar@都是有效的標(biāo)簽。 要為一個(gè)表達(dá)式加標(biāo)簽,我們只要在其前加標(biāo)簽即可
loop@ for (i in 1..100) {
for (j in 1..100) {
if (……) break@loop
}
}