Kotlin實戰【四】迭代事物:while和for
1、while迴圈
kotlin的while
和do-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設定他,不需要get
和set
。
如下程式碼:
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、
..
包含起始值和結束值。