Kotlin 修煉手冊(3)分支、循環、關鍵字

前言

這篇主要記一下 Kotlin 中的分支(條件判斷)、循環以及經常使用的一些關鍵字。html

分支

if-elsejava

if-else 結構的用法大致上和 Java 一致,好比:數組

fun main() {
    val score = 50
    if (score < 0) {
        println("分數不符合,應該爲非負數")
    } else if (score < 60) {
        println("不及格")
    } else if (score < 80) {
        println("及格")
    } else if (score < 90) {
        println("良好")
    } else if (score < 101) {
        println("優秀")
    } else {
        println("分數不符合,最大爲100")
    }
}
複製代碼

同時 if-else 結構能夠做爲表達式,做用相似於 Java 中的 ?:bash

// 當知足if中的條件時c的值是a,不然c的值是b
val c = if(condition) a else b
複製代碼

whenapp

Kotlin 中用 when 關鍵字代替了 Java 中的 switch,但用法相似。when 中,else 類比於 switch 中的 default,當其餘分支不匹配時走 else。若是不少分支須要用相同的方式處理,則能夠把多個分支條件放在一塊兒,用 , 分隔。oop

fun main() {
    val x = 'd'
    when(x){
        'a' -> println("x = a")
        'b' -> println("x = b")
        'C','c' -> println("x = C or c")
        else -> println("x is others")
    }
}
// 運行結果
x is others
複製代碼

Kotlin 中至關於默認加上 break,由上往下依次對照case,若是符合條件,則執行對應的語句,以後的分支不會繼續走。ui

fun main() {
    val x = 5
    when (x) {
        in 1..10 -> print("x is in 1 to 10")
        !in 10..20 -> print("x is not in 10 to 20")
        else -> print("none of the above")
    }
}
// 運行結果
x is in 1 to 10
複製代碼

能夠看到,x 雖然同時知足 in 1..10!in 10..20 兩個條件,可是隻會走第一條分支。spa

同時,和 if-else 結構同樣,when 也能夠做爲表達式,若是做爲表達式,最早 符合條件的分支的值就是整個表達式的值。code

fun main() {
    val x = 5
    val c = when (x) {
        0 -> "x = 0"
        1 -> "x = 1"
        else -> "x = else"
    }
    println(c)
}
//運行結果
x = else
複製代碼

when 能夠用來取代 if-else if 鏈,若是不提供參數,全部的分支條件都是簡單的布爾表達式,而當一個分支的條件爲真時則執行該分支:htm

以前 if-else 結構的例子能夠用 when 來改寫:

fun main() {
    val score = 50
    when{
        score < 0 -> println("分數不符合,應該爲非負數")
        score < 60 -> println("不及格")
        score < 80 -> println("及格")
        score < 90 -> println("良好")
        score < 101 -> println("優秀")
        else -> println("分數不符合,最大爲100")
    }
}
//運行結果
不及格
複製代碼

循環

Kotlin 中,for 循環能夠對任何提供迭代器的對象進行遍歷。一般使用 in 關鍵字表示在某一個區間或某一集合中。

fun main() {
    val arr = arrayOf("one", "two", "three")
    for (a in arr){
        println(a)
    }
}
// 運行結果
one
two
three
複製代碼

能夠看到,表示當前元素的變量 a,不用顯式申明類型

若是想經過索引(下標)遍歷一個數組或 list 時,可使用 indices 變量來得到索引:

fun main() {
    val array = arrayOf("one", "two", "three")
    for (i in array.indices){
        println(array[i])
    }
}
複製代碼

或者使用 withIndex() 方法,同時得到下標和值。

fun main(){
    val array = arrayOf("apple", "banana", "orange")
    for ((index, value) in array.withIndex()) {
        println("the element at $index is $value")
    }
}
//輸出結果
the element at 0 is apple
the element at 1 is banana
the element at 2 is orange
複製代碼

Kotlin 中的 whiledo-while 的用法和 Java 中同樣,看兩個例子理解一下。

fun main() {
    var i = 0
    while(i < 5){
        print("$i ")
        i++
    }
}
//運行結果
0 1 2 3 4 

fun main() {
    var i = 0
    do {
        print("$i ")
        i++
    }while (i < 5)
}
//運行結果
0 1 2 3 4 
複製代碼

經常使用關鍵字

在分支和循環部分,提到了一些關鍵字或符號,但沒有專門解釋過。這部分就來說講一些經常使用的關鍵字。

in:表示在一個區間或集合內(數組、list、set 等)

!in:和 in 正好相反,表示不在該範圍中

a..b:表示閉區間 [a,b],其中 a <= b

until:a until b 表示左閉右開區間 [a,b),其中 a <= b

fun main() {
    for (i in 1..10) {
        print("$i ")
    }
}
//運行結果
1 2 3 4 5 6 7 8 9 10 
複製代碼
fun main() {
    for (i in 1 until 10){
        print("$i ")
    }
}
//運行結果
1 2 3 4 5 6 7 8 9 
複製代碼

step:步長,循環時的間隔

fun main() {
    for (i in 1 until 10 step 2){
        print("$i ")
    }
}
//運行結果
1 3 5 7 9 
複製代碼

downTo:a downTo b 表示從大到小遞減的閉區間 [a, b],a >= b

fun main() {
    for (i in 10 downTo 2 step 2){
        print("$i ")
    }
}
//運行結果
10 8 6 4 2 
複製代碼

is:是不是某一個類型,相似於 Java 中的 instanceof 關鍵字

而且 Kotlin 中會進行智能類型轉換,若是是某一個類型,就會自動轉換成該類型,不用顯式類型轉換。

舉個例子:

實現一個將字符串轉化爲大寫,可是參數是Object(Kotlin 中爲 Any)類型,不能直接調用方法,須要先進行類型判斷。Java 中的實現:

public class TestJava {
    public static void stringToUpperCase(Object o){
        if(o instanceof String){
            System.out.println(((String) o).toUpperCase());
        } else {
            System.out.println("不是String類型");
        }
    }
    public static void main(String[] args) {
        stringToUpperCase("hello");
        stringToUpperCase(1);
    }
}
//運行結果
HELLO
不是String類型
複製代碼

Kotin 的實現:

fun stringToUpperCase(o : Any){
    if(o is String){
        println(o.toUpperCase())
    }else{
        println("不是String類型")
    }
}
fun main() {
    stringToUpperCase("hello")
    stringToUpperCase(1)
}
//運行結果
HELLO
不是String類型
複製代碼

二者的不一樣的在於 Java 在是 String 類型時,要使用 ((String) o) 進行強制類型轉換,而 Kotlin 已經直接幫咱們轉換了,寫起來更加簡潔。

結語

關於 Kotlin 中分支、循環、經常使用關鍵字就先寫到這裏,下一篇將介紹 Kotlin 中的類與對象。

參考資料

Kotlin 條件控制

Kotlin 循環控制

相關文章
相關標籤/搜索