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

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

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

下面詳細爲你們講解Kotlin中的控制語句使用。不得不說其和Java中仍是有不少不同的地方。github

目錄

1、if語句

Kotlin中的if語句和Java仍是仍是有必定的區別的,它能在Java中更靈活,除了能實現Java寫法外,還能夠實現表達式(實現三元運算符),及做爲一個塊的運用。編程

一、傳統寫法(同Java寫法同樣)數組

例:編程語言

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

輸出結果爲:函數

numA == 2 => true
複製代碼

二、Kotlin中的三元運算符post

  • 在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")
複製代碼

輸出結果爲:spa

numB = > 3
複製代碼

由上能夠看出,Kotlin中的if能夠做爲一個表達式並返回一個值。code

三、做爲一個塊結構,而且最後一句表達式爲塊的值

例:

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
複製代碼

2、for語句

  • Kotlin廢除了Java中的for(初始值;條件;增減步長)這個規則。可是Kotlin中對於for循環語句新增了其餘的規則,來知足剛提到的規則。
  • for循環提供迭代器用來遍歷任何東西
  • for循環數組被編譯爲一個基於索引的循環,它不會建立一個迭代器對象

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

  • 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.二、遞減
  • 關鍵字: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.三、符號(' .. ') 表示遞增的循環的另一種操做

  • 使用符號( '..').
  • 範圍:..[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.四、設置步長

關鍵字:step

例:

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

輸出結果爲:

i => 10 	i => 12 	i => 14 
複製代碼

二、迭代

  • for循環提供一個迭代器用來遍歷任何東西。
  • for循環數組被編譯爲一個基於索引的循環,它不會建立一個迭代器對象

2.一、遍歷字符串

此用法在數據類型章節中的字符串類型中用到過。還不甚清楚的能夠查看 Kotlin——初級篇(三):數據類型詳解

例:

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

輸出結果爲:

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

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.三、使用數組的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.四、使用數組的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.五、使用列表或數組的擴展函數遍歷

  • 數組或列表有一個成員或擴展函數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循環語句經常使用的用法。

3、when語句

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

3.一、when語句實現switch語句功能

例:

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

輸出結果爲:

5
複製代碼

3.二、和逗號結合使用,至關於switch語句中的不使用break跳轉語句

例:

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

輸出結果爲:

1
複製代碼

3.三、條件可使用任意表達式,不只侷限於常量

至關於if表達式的用法。

例:

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

輸出結果爲:

num < 5
複製代碼

3.四、 檢查值是否存在於集合或數組中

  • 操做符:
    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.五、檢查值是否爲指定類型的值

  • 操做符
    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.六、不使用表達式的when語句

表示爲最簡單的布爾表達式

例:

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

     }
}
複製代碼

輸出結果爲:

null 	 null 	 null 
複製代碼

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

4、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 次
複製代碼

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 次
複製代碼

6、跳轉語句(returnbreakcontinue

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

一、return語句

默認狀況下,從最近的封閉函數或匿名函數返回。

例:

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

輸出結果爲:

我退出了該方法
複製代碼

二、break語句

做用:終止最近的閉合循環。

例:

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

輸出結果爲:

我在第5 次退出了循環
我循環了多少次:count => 5
複製代碼

三、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
複製代碼

7、總結

無論對於任何一門編程語言,都有最基本的條件邏輯控制語句,而其語句是學習一門編程語言的基礎。因此請各位大佬認真而且跟着代碼敲一遍。特別是for語句和when語句這兩個點。由於這兩個點都和Java語言很大的改動。固然,if語句中的三元運算符也是值得注意的
源代碼

若是各位大佬看了以後感受還闊以,就請各位大佬隨便star一下,您的關注是我最大的動力。
個人我的博客Jetictors
GithubJteictors

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

QQ羣號:497071402

相關文章
相關標籤/搜索