1. 程式人生 > >Kotlin中的流程控制語句

Kotlin中的流程控制語句

流程控制語句是程式語言中的核心之一。可以分為 分支語句、迴圈語句和跳轉語句。下面我們深入的瞭解Kotlin的流程控制語句。

if

if-else語句是控制程式流程的最基本的形式,其中else是可選的。

在Kotlin中,if是表示式,比如它可以返回一個值。 是除了condition ? then : else)之外的唯一一個三元表達。

傳統用法

val a = 10
val b = 20
var max_0: Int = a

if (a > b) {
    max_0 = a

} else {
    max_0 = b
}

println("----------------------------------")
println("max_0:$max_0")
println("----------------------------------")

// Log
--------------
max_0:20
--------------

作為表示式

var max_1 = if (a > b) a else b
println("--------------")
println("max_1:$max_1")
println("--------------")

//Log
--------------
max_1:20
--------------

作為程式碼塊

println("--------------")
val max_2 = if (a > b) {
    println("Choose a")
    a
} else {
    println("Choose b")
    b
}

println("max_2:$max_2")
println("--------------")

// Log  
--------------
Choose b
max_2:20
--------------

if作為程式碼塊時,最後一行必須為該塊的返回值.

如果 if 表示式只有一個分支, 或者分支的結果是 Unit , 它的值就是 Unit 。

if-else語句規則:

  • if後的括號不能省略,括號裡表示式的值最終必須返回的是布林值
  • 如果條件體內只有一條語句需要執行,那麼if後面的大括號可以省略,但這是一種極為不好的程式設計習慣。
  • 對於給定的if,else語句是可選的,else if 語句也是可選的
  • else和else if同時出現時,else必須出現在else if 之後
  • 如果有多條else if語句同時出現,那麼如果有一條else if語句的表示式測試成功,那麼會忽略掉其他所有else if和else分支。
  • 如果出現多個if,只有一個else的情形,else子句歸屬於最內層的if語句

when

when取代了C風格語言的switch。相較switch而言,when語句顯得更加的強大,靈活性更好。

when會對所有的分支進行檢查直到有一個條件滿足。 when 可以用做表示式或宣告。如果用作表示式的話,那麼滿足條件的分支就是總表示式。如果用做宣告,不滿足條件的分支的的的值會被忽略,只保留滿足條件的分支,而且返回的值也是最後一個表示式的值。

傳統用法

val x : Int = 10

when (x) {
    9 -> println("x:${x + 10}")
    10 -> println("x:$x")
    else -> print("x:$x")
}

分支條件一致

如果有分支可以用同樣的方式處理的話, 分支條件可以連在一起處理。

when (x) {
    0,1 -> print("x == 0 or x == 1")
    else -> print("otherwise")
}

使用任意表達式作為分支的條件

when (x) {
    parseInt(s) -> print("s encode x")
    else -> print("s does not encode x")
}

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")
}

作為表示式

val hasPrefix = when (x) {
    is String -> x.startsWith("prefix")
    else -> false
}

for

for 迴圈通過任何提供的迭代器進行迭代。 語法如下:

for (item in collection)
    print(item)

如果遍歷list或者array可以通過索引進行迭代:

for (i in array.indices)
    print(array[i])

while迴圈

while語句

while語句在迴圈剛開始時,會計算一次布林表示式的值,如果滿足條件,進入迴圈,如果不滿足條件,將跳出迴圈。而在while語句的下一次迭代開始前會計算再一次布林值,如此重複。

while (x > 0) {
    x--
} 

dowhile語句

dowhile語句與while語句類是,唯一的區別是doWhile語句會至少執行一次,即便布林表示式的第一次計算就是false.而while語句中,如果 布林表示式的第一次計算的值是false,該迴圈不會執行。

do {
    val y = retrieveData()
} while (y != null) // y 在這是可見的

返回與跳轉

Kotlin中有return、break、continue等三種返回跳轉操作符。

  • return

    1. 指定一個方法返回什麼值
    2. 導致當前方法結束,並返回返回指定的值

      fun main(args: Array<String>) {
      
      
          println("testA:${testA(10)}")
      
          println("----------")
      
          println("testB:${testB(10)}")
      }
      
      fun testA(a : Int):Int{
          if (a > 0) {
              return -1
          } else {
              return 1
          }
      }
      
      fun testB(a : Int):Int{
      
          println("a:$a")
      
          if (a > 0) {
              return -1
          } else {
              return 1
          }
      
          a++
      
          print("a:$a")
      }
      
      // Log列印
      testA:-1
      ----------
      a:10
      testB:-1
      
  • break
    結束最近的閉合迴圈,不執行迴圈中剩餘的語句

    val arraysA = listOf("A", "B", "C", "D")
    val arraysB  = listOf(1,2,3,4)
    for (itemA in arraysA) {
        for (itemB in arraysB) {
            if (itemB > 2) {
                break
            }
            println("itemB:$itemB")
        }
    
        if (itemA == "C") {
            break
        }
        println("itemA:$itemA")
    }
    
    // Log
    itemB:1
    itemB:2
    itemA:A
    itemB:1
    itemB:2
    itemA:B
    itemB:1
    itemB:2
    

從Log列印可以看出,第一個break結束的是for (itemB in arraysB)這個迴圈,而第二個break結束的是for (itemA in arraysA),它們的共通點就是結束都是距離它們最近的一個迴圈。

  • continue
    跳到最近的閉合迴圈的下一次迴圈

    val arraysA = listOf("A", "B", "C", "D")
    val arraysB  = listOf(1,2,3,4)
    
    for (itemA in arraysA) {
        var i : Int = 0
        for (itemB in arraysB) {
            i++
            if (itemB > 2) {
                continue
            }
    
            println("itemB:$itemB")
        }
    
        if (itemA == "C") {
            continue
        }
        println("i:$i")
        println("itemA:$itemA")
        println("---------")
    }
    
    // Log
    itemB:1
    itemB:2
    i:4
    itemA:A
    ---------
    itemB:1
    itemB:2
    i:4
    itemA:B
    ---------
    itemB:1
    itemB:2
    itemB:1
    itemB:2
    i:4
    itemA:D
    ---------   
    

    從上述Log上,可以清楚看到,兩個迴圈分別迴圈了四次,但是在碰到continue時,會跳出當前迴圈並執行下一次迴圈。

標籤

在 Kotlin 中表達式可以新增標籤,標籤通過@結尾來表示,比如:[email protected][email protected]

[email protected] for (i in 1..100){
    //...
}

break和標籤

[email protected] for (itemA in arraysA) {
    var i : Int = 0
    for (itemB in arraysB) {
        i++
        if (itemB > 2) {
            [email protected]
        }

        println("itemB:$itemB")
    }

    println("i:$i")
    println("itemA:$itemA")
    println("---------")
}

// Log列印
itemB:1
itemB:2

從Log列印,第一個迴圈執行了一次,第二個迴圈執行了兩次,便跳出了封閉的迴圈。意味著break跳到標籤後邊的表示式,並不再執行此表示式直接跳過,執行後邊的語句。

continue和標籤

[email protected] for (itemA in arraysA) {
    var i : Int = 0
    for (itemB in arraysB) {
        i++
        if (itemB > 2) {
            [email protected]
        }

        println("itemB:$itemB")
    }

    println("i:$i")
    println("itemA:$itemA")
    println("---------")
}

// Log列印
itemB:1
itemB:2
itemB:1
itemB:2
itemB:1
itemB:2
itemB:1
itemB:2

之前說過,continue是跳到最近的閉合迴圈的下一次迴圈,但是加上標籤以後,直接跳轉到了第一個迴圈,也就是for (itemA in arraysA),並沒有執行最近的閉合迴圈的下一次迴圈。意味著continue直接跳轉到標籤後面的語句並執行。

return和標籤

val ints = listOf(0, 1, 2, 3)

fun main(args: Array<String>) {

    foo()

}

fun foo() {
    ints.forEach {
        if (it ==0) [email protected]
        println(it)
    }
}

// Log列印
1
2
3

fun foo() {
    ints.forEach {
    if (it ==0) [email protected]
        print(it)
    }
}

從Log列印可以看出,return會跳轉到標籤後邊的表示式處,並執行該表示式。

命名函式自動定義標籤

foo outer() {
    foo inner() {
        [email protected]
    }
}

作用域

這裡寫圖片描述

從作用域來看,標籤和變數是一致的,都有相對應的作用於。在main方法裡面定義了一個標籤[email protected],在foo方法裡面呼叫時,提示“Unresolved reference:@list”,意味著list標籤的作用域應該在main方法裡,在foo方法裡並不能夠呼叫。

相關推薦

Kotlin流程控制語句

流程控制語句是程式語言中的核心之一。可以分為 分支語句、迴圈語句和跳轉語句。下面我們深入的瞭解Kotlin的流程控制語句。 if if-else語句是控制程式流程的最基本的形式,其中else是可選的。 在Kotlin中,if是表示式,比如它可以返回一個

“全棧2019”Java第二十一章:流程控制語句的決策語句if

難度 初級 學習時間 10分鐘 適合人群 零基礎 開發語言 Java 開發環境 JDK v11 IntelliJ IDEA v2018.3 文章原文連結 “全棧2019”Java第二十一章:流程控制語句中的決策語句if 下一章 “全棧2019”Java第二十二章:控制流

“全棧2019”Java第二十三章:流程控制語句決策語句switch上篇

難度 初級 學習時間 10分鐘 適合人群 零基礎 開發語言 Java 開發環境 JDK v11 IntelliJ IDEA v2018.3 文章原文連結 “全棧2019”Java第二十三章:流程控制語句中決策語句switch上篇 下一章 “全棧2019”Java第二十四

“全棧2019”Java第二十六章:流程控制語句迴圈語句do-while

難度 初級 學習時間 10分鐘 適合人群 零基礎 開發語言 Java 開發環境 JDK v11 IntelliJ IDEA v2018.3 文章原文連結 “全棧2019”Java第二十六章:流程控制語句中迴圈語句do-while 下一章 “全棧2019”Java第二十七

“全棧2019”Java第二十七章:流程控制語句迴圈語句for

難度 初級 學習時間 10分鐘 適合人群 零基礎 開發語言 Java 開發環境 JDK v11 IntelliJ IDEA v2018.3 文章原文連結 “全棧2019”Java第二十七章:流程控制語句中迴圈語句for 下一章 “全棧2019”Java第二十八章:陣列詳

“全棧2019”Java第二十四章:流程控制語句決策語句switch下篇

難度 初級 學習時間 10分鐘 適合人群 零基礎 開發語言 Java 開發環境 JDK v11 IntelliJ IDEA v2018.3 文章原文連結 “全棧2019”Java第二十四章:流程控制語句中決策語句switch下篇

java 的三種流程控制語句

1.順序結構   順序結構:是程式最簡單最基本的流程控制,沒有特定的語法結構,按照程式碼的先後順序,依次執行,程式中大多數的程式碼都是這樣執行的。  執行流程:從上往下,依次執行。 2.選擇結構   if語句格式    格式1      if(比較表示式orboolean型別的值){      

MYSQL流程控制語句

一、條件語句 (1) IF條件語句 語法: IF search_condition THEN     statement_list ELSE     statement_list END IF; 例:比較兩個數大小 DELIMITER// CREATE PROCEDURE

JAVA鍵盤的錄入及基本的流程控制語句

鍵盤的錄入 導包: import java.util.Sanner; 建立鍵盤錄入物件: Scanner sc=new Scanner(System.in); 通過物件獲取資料 int x=sc.nextlnt(); 當然除了錄入整形可也以錄入其它資料型別。 流程控制語

js流程控制語句

4.2 流程控制語句 無論是傳統程式語言,還是指令碼語言,構成程式的最基本的結構:順序結構、選擇結構、迴圈結構(再複雜的邏輯,也是這3個部分組成)   順序結構:使用的最為廣泛,程式在執行時,將按照程式碼的書寫順序,自上而下的依次執行。 選擇結構:但是如果碰到需要進行條件選

jenkins pipeline動態定義變數(流程控制語句

場景:根據job名稱定義不同的程式碼倉庫地址和分支 方案:使用script把整個程式碼下載過程包含起來 常規寫法是這樣的: pipeline { agent { label 'test' } stages { stage('D

六類運算子+鍵盤錄入+流程控制語句之順序結構與選擇結構的if與switch語句部分+練習+面試題(java基礎語法篇二)

一。運算子(對常量和變數進行操作的符號)1.1算術運算子嘗試敲出以下程式碼,看看輸出的結果分別是什麼?相信通過敲出上面程式碼並執行,已經看出 /運算子是取商,而且商是向下取整,%則是取餘數沒理解的話做下下面兩個題試試(答案在下面,先自己計算出答案再敲出來驗證) 第一題答案 9

C#的主要流程控制語句之跳轉語句

跳轉語句用於改變程式的執行流程,轉移到指定之處。 C#中有4中跳轉語句:如下圖所示: 1.Break語句 可以使用Break語句終止當前的迴圈或者它所在的條件語句。然後,控制被傳遞到迴圈或條件語句的嵌入語句後面的程式碼行。Break語句的語法極為簡單,它沒有括號

mysql流程控制語句小結

mysql中有如下的幾個的控制流程的語句: 1) case    // Below will return zero   SELECT CASE 0 WHEN 0 THEN 'zero' WHEN 1 THEN 'one' ELSE 'no one' END;     //

linux的shell script 的流程控制語句

一 :條件判斷: if [ 判斷條件 ];then    當條件成立時執行的語句,其實跟程式語言裡的差不多! fi 或者多重條件判斷 if [ 判斷條件1 ];then 滿足1,則執行這裡的指令 elif [ 判斷條件2 ];then . . . . else   當上面所

Oracle流程控制語句

控制 space reverse logs 2.3 1.2 流程控制語句 case ora 1.選擇語句 1.1 IF...THEN...END IF語句 DECLARE MY_AGE INT; IF MY_AGE IS NULL THEN DBMS

java基礎:流程控制語句(選擇結構if語句)

這樣的 執行 錯誤數據 一點 選擇 邏輯運算符 月份 等級 pri (1)順序結構 從上往下,依次執行 Demo:class ShunXuJieGouDemo { public static void main(String[] args) { System.o

流程控制語句

基礎 num cor 支持 流程 編寫 ons 執行 結果 一、條件語句 條件語句就是指通過判斷得到的結果,來決定是執行還是跳過指定的代碼塊。 1、if 語句 if 語句是條件判斷語句,也是最基本的流程控制語句。 例如: var num = 5;if(num < 10

js流程控制語句

var if else script 流程控制 寫法 break def 嵌套 default 條件語句 條件語句通過判斷得到的結果,來決定是執?還是跳過指定的代碼塊 JavaScript 提供了兩種條件語句: if else switch case if 語句 代碼實現

pl/sql流程控制語句if else條件選擇語句

結構 選擇 表達 滿足 if條件 條件語句 lin output 選擇語句 if條件語句。 if條件語句的基本結構 IF <布爾表達式> THEN PL/SQL 和 SQL語句 END IF; 或 IF <布爾表達式> THEN PL/SQL 和 S