1. 程式人生 > >Kotlin實戰【四】迭代事物:while和for

Kotlin實戰【四】迭代事物:while和for

1、while迴圈

kotlin的whiledo-while與Java語法一致,這裡簡單看一下

while (condition) { //當條件為真時,程式碼體執行
    /*...*/
}
do {//無條件的執行一次,之後當條件為真時執行
    /*...*/
} while (condition)

2、for迴圈

for迴圈僅以一種形式存在,和java的for-each迴圈一致

Java

int[] data={1,2,3,4,5,6,7,8,9,10};

for(int i:data){
  system.out,println("i");
}

Kotlin

for(i in 10){
  print(i)
}

3、數字迭代:區間和數列

kotlin中沒有java的常規迴圈,所以kotlin使用了區間的概念

區間本質:兩個值之間的間隔。這兩個值通常是數字:一個是起始值,一個是結束值。使用 ..來表示

例:

val oneToTen = 1..10

注意:kotlin區間是閉合的,意味著第二個值始終是區間的一部分
如果你能迭代區間中所有的值,這樣的區間叫做數列

舉個例子使用不帶引數的when實現FizzBuzz:
規則:用fizz單詞替代任何可以被三整除的數字,用buzz單詞替代任何可以被五整除的數字。如果一個數字同時是三和五的乘數,我們叫“FizzBuzz”。

fun fizzBuzz(i: Int) = when {
    i % 15 == 0 -> "FizzBuzz " //i可以被15整除,返回FizzBuzz。就像在Java中,%是模操作
    i % 3 == 0 -> "Fizz " //i可以被5整除,返回Buzz
    i % 5 == 0 -> "Buzz " //i可以被3整除,返回Fizz
    else -> "$i " //Else返回這個數字本身
}
for (i in 1..100) { //迭代整數範圍1..100
    print(fizzBuzz(i))
}
//1 2 Fizz 4 Buzz Fizz 7 ...

4、迭代map

我們提到過,最常見的情形是,for…in迴圈是迭代一個集合。這個是和Java是一樣的,所以下面我們看看怎麼迭代一個map。

舉個例子:列印字元的二進位制表示

val binaryReps = TreeMap<Char, String>()//用TreeMap,所以鍵是排序的

for (c in 'A'..'F') { //用字元的範圍迭代從A到F的字元
    val binary = Integer.toBinaryString(c.toInt()) //ASCII編碼轉換到二進位制
    binaryReps[c] = binary//在map中用c鍵儲存值
}
for ((letter, binary) in binaryReps) { //迭代一個map,把鍵值對賦值到兩個變數
    println("$letter = $binary")
}

從上面程式碼可以看出來..語法建立範圍不僅僅對數字適用,也對字元適用。

上面的程式碼使用了一個小技巧,使用鍵來訪問和更新map的簡明語法,可以使用map[key]來讀取值,並使用map[key]=value設定他,不需要getset
如下程式碼:
binaryReps[c] = binary
等價於java:
binaryReps。put(c,binary)

5、使用in檢查集合和區間的成員

使用in運算子來檢查一個值是否在區間中,或者它的逆運算!in來檢查這個值是否不在這個區間中。

fun isLetter(c: Char) = c in 'a'..'z' || c in 'A'..'Z'
fun isNotDigit(c: Char) = c !in '0'..'9'
println(isLetter('q')) //true
println(isNotDigit('x')) //true

其實 c in 'a'..'z'等價於a <= c && c <= z

in和!in操作子也可以在when表示式裡面使用

fun recognize(c: Char) = when (c) {
    in '0'..'9' -> "It's a digit!"
    in 'a'..'z', in 'A'..'Z' -> "It's a letter!"
    else -> "I don't know…"
}
println(recognize('8')) //It's a digit!

in的使用範圍不只侷限於字串。如果你有任何支援比較例項的類(實現了java.lang.Comparable),就可以對這個類的例項進行比較。
如:

println("Kotlin" in "Java".."Scala") //和“Java” <= “Kotlin” && “Kotlin” <= “Scala”一樣
//true

字串在這裡是按字母比較的,因為那是String類是這樣實現Comparable介面的。

in同樣適用於集合

println(“Kotlin” in setOf(“Java”, “Scala”,“hello”)) //這個集沒有“Kotlin”字串
//false

kotlin不包含在集合裡面。

總結

  • 1、for 、while和do-while迴圈與java相似,但是for迴圈現在更加方便,特別是迭代map的時候。
  • 2、用簡潔的語法1..5表示區間。
  • 3、可以使用in和!in運算子來檢查某個值是否屬於某個區間。
  • 3、..包含起始值和結束值。