Kotlin——初級篇(四):控制語句(if、for、while、when、do...while、跳轉語句)詳解

Jetictors發表於2017-12-17

Kotlin——初級篇(四):控制語句(if、for、while、when、do...while、跳轉語句)詳解

在前面 的章節中講解了Kotlin語言中的資料型別、變數與常量的定義。不瞭解請參見前面的內容:

  1. Kotlin——初級篇(三):資料型別詳解
  2. Kotlin——初級篇(二):變數、常量、註釋

下面詳細為大家講解Kotlin中的控制語句使用。不得不說其和Java中還是有很多不一樣的地方。

目錄

Kotlin——初級篇(四):控制語句(if、for、while、when、do...while、跳轉語句)詳解

一、if語句

Kotlin中的if語句和Java還是還是有一定的區別的,它能在Java中更靈活,除了能實現Java寫法外,還可以實現表示式(實現三元運算子),及作為一個塊的運用。

1、傳統寫法(同Java寫法一樣)

例:

var numA = 2
if (numA == 2){
    println("numA == $numA => true")
}else{
    println("numA == $numA => false")
}
複製程式碼

輸出結果為:

numA == 2 => true
複製程式碼

2、Kotlin中的三元運算子

  • 在Kotlin中其實是不存在三元運算子(condition ? then : else)這種操作的。
  • 那是因為if語句的特性(if表示式會返回一個值)故而不需要三元運算子。

例:

// 在Java中可以這麼寫,但是Kotlin中直接會報錯。
// var numB: Int = (numA > 2) ? 3 : 5

// kotlin中直接用if..else替代。例:
var numB: Int = if ( numA > 2 ) 3 else 5  // 當numA大於2時輸出numB的值為3,反之為5
println("numB = > $numB")
複製程式碼

輸出結果為:

numB = > 3
複製程式碼

由上可以看出,Kotlin中的if可以作為一個表示式並返回一個值。

3、作為一個塊結構,並且最後一句表示式為塊的值

例:

var numA: Int = 2
var numC: Int = if (numA > 2){
    numA++
    numA = 10
    println("numA > 2 => true")
    numA
}else if (numA == 2){
    numA++
    numA = 20
    println("numA == 2 => true")
    numA
}else{
    numA++
    numA = 30
    println("numA < 2 => true")
    numA
}

// 根據上面的程式碼可以看出,每一個if分支裡面都是一個程式碼塊,並且返回了一個值。根據條件numC的值應該為20
println("numC => $numC")
複製程式碼

輸出結果為:

numA == 2 => true
numC => 20
複製程式碼

二、for語句

  • Kotlin廢除了Java中的for(初始值;條件;增減步長)這個規則。但是Kotlin中對於for迴圈語句新增了其他的規則,來滿足剛提到的規則。
  • for迴圈提供迭代器用來遍歷任何東西
  • for迴圈陣列被編譯為一個基於索引的迴圈,它不會建立一個迭代器物件

1、新增的規則,去滿足for(初始值;條件;增減步長)這個規則

  • 1.1、遞增

關鍵字:until 範圍:until[n,m) => 即大於等於n,小於m

例:

  // 迴圈5次,且步長為1的遞增
  for (i in 0 until 5){
    print("i => $i \t")
  }
複製程式碼

輸出結果為

i => 0 	i => 1 	i => 2 	i => 3 	i => 4
複製程式碼
  • 1.2、遞減
  • 關鍵字:downTo
  • 範圍:downTo[n,m] => 即小於等於n,大於等於m ,n > m

例:

// 迴圈5次,且步長為1的遞減
for (i in 15 downTo 11){
    print("i => $i \t")
}
複製程式碼

輸出結果為:

i => 15 	i => 14 	i => 13 	i => 12 	i => 11 	
複製程式碼

1.3、符號(' .. ') 表示遞增的迴圈的另外一種操作

  • 使用符號( '..').
  • 範圍:..[n,m]=> 即大於等於n,小於等於m
  • until的區別,一是簡便性。二是範圍的不同。

例:

print("使用 符號`..`的列印結果\n")
for (i in 20 .. 25){
    print("i => $i \t")
}

println()

print("使用until的列印結果\n")
for (i in 20 until 25){
    print("i => $i \t")
}
複製程式碼

輸出結果為:

使用 符號`..`的列印結果
i => 20 	i => 21 	i => 22 	i => 23 	i => 24 	i => 25 	
使用until的列印結果
i => 20 	i => 21 	i => 22 	i => 23 	i => 24 
複製程式碼

1.4、設定步長

關鍵字:step

例:

for (i in 10 until 16 step 2){
    print("i => $i \t")
}
複製程式碼

輸出結果為:

i => 10 	i => 12 	i => 14 
複製程式碼

2、迭代

  • for迴圈提供一個迭代器用來遍歷任何東西。
  • for迴圈陣列被編譯為一個基於索引的迴圈,它不會建立一個迭代器物件

2.1、遍歷字串

此用法在資料型別章節中的字串型別中用到過。還不甚清楚的可以檢視 Kotlin——初級篇(三):資料型別詳解

例:

for (i in "abcdefg"){
    print("i => $i \t")
}
複製程式碼

輸出結果為:

i => a 	i => b 	i => c 	i => d 	i => e 	i => f 	i => g 	
複製程式碼

2.2、遍歷陣列

此用法在資料型別章節中的陣列型別中用到過。還不甚清楚的可以檢視 Kotlin——初級篇(三):資料型別詳解

例:

var arrayListOne = arrayOf(10,20,30,40,50)
for (i in arrayListOne){
    print("i => $i \t")
}
複製程式碼

輸出結果為:

i => 10 	i => 20 	i => 30 	i => 40 	i => 50 	
複製程式碼

2.3、使用陣列的indices屬性遍歷

例:

var arrayListTwo = arrayOf(1,3,5,7,9)
for (i in arrayListTwo.indices){
    println("arrayListTwo[$i] => " + arrayListTwo[i])
}
複製程式碼

輸出結果為:

arrayListTwo[0] => 1
arrayListTwo[1] => 3
arrayListTwo[2] => 5
arrayListTwo[3] => 7
arrayListTwo[4] => 9
複製程式碼

2.4、使用陣列的withIndex()方法遍歷

例:

var arrayListTwo = arrayOf(1,3,5,7,9)
for ((index,value) in arrayListTwo.withIndex()){
    println("index => $index \t value => $value")
}
複製程式碼

輸出結果為:

index => 0 	 value => 1
index => 1 	 value => 3
index => 2 	 value => 5
index => 3 	 value => 7
index => 4 	 value => 9
複製程式碼

2.5、使用列表或陣列的擴充套件函式遍歷

  • 陣列或列表有一個成員或擴充套件函式iterator()實現了Iterator<T>介面,且該介面提供了next()hasNext()兩個成員或擴充套件函式
  • 其一般和while迴圈一起使用
  1. 可以檢視Array.kt這個類。可以看見其中的iterator()函式,而這個函式實現了Iterator介面。

     /**
       *   Creates an iterator for iterating over the elements of the array.
       */
     public operator fun iterator(): Iterator<T>
    複製程式碼
  2. 檢視Iterator.kt這個介面類,這個介面提供了hasNext()函式和next()函式。

     public interface Iterator<out T> {
    
     /**
       * Returns the next element in the iteration.
       */
     public operator fun next(): T
    
     /**
       * Returns `true` if the iteration has more elements.
       */
     public operator fun hasNext(): Boolean
     }
    複製程式碼

例:

var arrayListThree = arrayOf(2,'a',3,false,9)
var iterator: Iterator<Any> = arrayListThree.iterator()

while (iterator.hasNext()){
    println(iterator.next())
}
複製程式碼

輸出結果為:

2
a
3
false
9
複製程式碼

終上所述就是for迴圈語句常用的用法。

三、when語句

  • Kotlin中已經廢除掉了Java中的switch語句。而新增了when(exp){}語句。
  • when語句不僅可以替代掉switch語句,而且比switch語句更加強大

3.1、when語句實現switch語句功能

例:

when(5){
    1 -> {
        println("1")
    }
    2 -> println("2")
    3 -> println("3")
    5 -> {
        println("5")
    }
    else -> {
        println("0")
    }
}
複製程式碼

輸出結果為:

5
複製程式碼

3.2、和逗號結合使用,相當於switch語句中的不使用break跳轉語句

例:

when(1){
     // 即x = 1,2,3時都輸出1。
    1 , 2 , 3 -> {
        println("1")
    }
    5 -> {
        println("5")
    }
    else -> {
        println("0")
    }
}
複製程式碼

輸出結果為:

1
複製程式碼

3.3、條件可以使用任意表示式,不僅侷限於常量

相當於if表示式的用法。

例:

var num:Int = 5
when(num > 5){
    true -> {
        println("num > 5")
    }
    false ->{
        println("num < 5")
    }
    else -> {
        println("num = 5")
    }
}
複製程式碼

輸出結果為:

num < 5
複製程式碼

3.4、 檢查值是否存在於集合或陣列中

  • 操作符:
    1. (in)
    2. (!in) 不在
  • 限定:只適用於數值型別

例:

var arrayList = arrayOf(1,2,3,4,5)
when(1){
    in arrayList.toIntArray() -> {
        println("1 存在於 arrayList陣列中")
    }
    in 0 .. 10 -> println("1 屬於於 0~10 中")
    !in 5 .. 10 -> println("1 不屬於 5~10 中")
    else -> {
        println("都錯了 哈哈!")
    }
}
複製程式碼

輸出結果為:

元素`1`存在於 arrayList陣列中
複製程式碼

其中,符號( .. )表示的意思。如例子中的0 .. 10就表示0至10或者0到10

3.5、檢查值是否為指定型別的值

  • 操作符
    1. (is)
    2. 不是(!is)
  • 值得注意的是,Kotlin的智慧轉換可以訪問型別的方法和屬性

例:

when("abc"){
    is String -> println("abc是一個字串")
    else -> {
        println("abc不是一個字串")
    }
}

// 智慧轉換
var a: Int = 2
when(a){
    !is Int -> {
        println("$a 不是一個Int型別的值")
    }
    else -> {
        a = a.shl(2)
        println("a => $a")
    }
}
複製程式碼

輸出結果為:

abc是一個字串
a => 8
複製程式碼

3.6、不使用表示式的when語句

表示為最簡單的布林表示式

例:

var array = arrayOfNulls<String>(3)
when{
     true -> {
         for (i in array){
             print(" $i \t")
         }
         println()
     }
     else -> {

     }
}
複製程式碼

輸出結果為:

 null 	 null 	 null 
複製程式碼

綜上所述,為Kotlinwhen控制語句的常見用法。可以看出它的強大。以及便利性。不僅可以替代掉Java語句中的swicth語句。甚至可以替換掉if語句。

四、while語句

  • 其同Java中的while迴圈一樣。在此不做累述。
  • 定義格式:
while(exp){  其中exp為表示式
      ...
}
複製程式碼

例:

var num = 5
var count = 1
while (num < 10){
    println("num => $num")
    println("迴圈了$count 次")
    count++
    num++
}
複製程式碼

輸出結果為:

num => 5
迴圈了1 次
num => 6
迴圈了2 次
num => 7
迴圈了3 次
num => 8
迴圈了4 次
num => 9
迴圈了5 次
複製程式碼

五、do...while語句

  • 其同Java中的do...while迴圈一樣。在此不做累述。
  • 定義格式:
do(exp){ // 其中exp為表示式
    ...
}(while)
複製程式碼

例:

var num = 5
var count = 1
do {
    println("num => $num")
    println("迴圈了$count 次")
    count++
    num++
}while (num < 10)
複製程式碼

輸出結果為:

num => 5
迴圈了1 次
num => 6
迴圈了2 次
num => 7
迴圈了3 次
num => 8
迴圈了4 次
num => 9
迴圈了5 次
複製程式碼

PS: do{...}while(exp)與while(exp){...}最大的區別是do{...}while(exp)最少執行一次,這點也是和Java相同的

例:

var num = 5
var count = 1
do {
    println("num => $num")
    println("迴圈了$count 次")
    count++
    num++
}while (num < 5)
複製程式碼

輸出結果為:

num => 5
迴圈了1 次
複製程式碼

六、跳轉語句(returnbreakcontinue

其同Java中的跳轉語句一樣。在此不做累述。

1、return語句

預設情況下,從最近的封閉函式或匿名函式返回。

例:

fun returnExample(){
    var str: String = ""
    if (str.isBlank()){
        println("我退出了該方法")
        return
    }
}
複製程式碼

輸出結果為:

我退出了該方法
複製程式碼

2、break語句

作用:終止最近的閉合迴圈。

例:

var count: Int = 1
for (i in 1 until 10){
    if (i == 5){
        println("我在第$i 次退出了迴圈")
        break
    }
    count++
}
println("我迴圈了多少次:count => $count")
複製程式碼

輸出結果為:

我在第5 次退出了迴圈
我迴圈了多少次:count => 5
複製程式碼

3、continue語句

前進到最近的封閉迴圈的下一個步驟(迭代)。

例:

    for (i in 1 until 10){
    if (i == 5){
        println("我跳過了第$i 次迴圈")
        continue
    }
    println("i => $i")
}
複製程式碼

輸出結果為:

i => 1
i => 2
i => 3
i => 4
我跳過了第5 次迴圈
i => 6
i => 7
i => 8
i => 9
複製程式碼

七、總結

不管對於任何一門程式語言,都有最基本的條件邏輯控制語句,而其語句是學習一門程式語言的基礎。所以請各位大佬認真並且跟著程式碼敲一遍。特別是for語句和when語句這兩個點。因為這兩個點都和Java語言很大的改動。當然,if語句中的三元運算子也是值得注意的
原始碼

如果各位大佬看了之後感覺還闊以,就請各位大佬隨便star一下,您的關注是我最大的動力。
我的個人部落格Jetictors
GithubJteictors

歡迎各位大佬進群共同研究、探索

QQ群號:497071402

Kotlin——初級篇(四):控制語句(if、for、while、when、do...while、跳轉語句)詳解

相關文章