Kotlin 循環(huán)和異常

image.png

前言


  • 在 Kotlin 的循環(huán)語句中,while 循環(huán)還有 do...while 循環(huán)和 Java 中是一致的,在這里就不再細(xì)說,而
    for 循環(huán)則和 Java 中有了很大的區(qū)別,異常處理也有了不同。

迭代數(shù)字


  • Java 中的 for 循環(huán),總是先初始化值,判斷值是否在限定的范圍內(nèi),在每一次循環(huán)更新值,一直到超出范圍。
  • 而在 Kotlin 中,for 循環(huán)沒有這樣的用法,但是為了替代這種常見用法,Kotlin 使用了區(qū)間的概念。

區(qū)間在本質(zhì)上就是兩個(gè)值之間的間隔,一個(gè)初始值,一個(gè)結(jié)束值,使用 .. 運(yùn)算符表示,通常是數(shù)字。

val oneToTen = 0..10
  • 上面的表達(dá)式等同于 Java 中 0 < oneToTen <= 10。
  • Kotlin 中的區(qū)間是閉合的,結(jié)束值始終是區(qū)間的一部分。
  • 那么舉一個(gè)例子,如何使用 for 循環(huán)打印 0~100 之間的數(shù)字呢?
for(i in 0..100) {
  println(i)
}

>> 0
>> 1
>> 2
...
>> 100
  • 在這里,i 的初始值是0,結(jié)束值是100。等同于 Java 代碼。
/* Java */
for(int i = 0; i <= 100; i++) {
  println(i);
}
  • 這時(shí)來了新的需求,要求倒序打印從100~0的數(shù)字,并要求只打印偶數(shù)。
for(i in 100 downTo 0 step 2) {
  println(i)
}

>> 100
>> 98
>> 96
...
>> 0
  • 這里我們可以看到使用了 downTostep,見名知意,downTo 表示從100 到 0 倒序,step 表示間隔,不寫默認(rèn)step 1。等同于 Java 代碼。
/* Java */
for(int i = 100; i >= 0; i-=2) {
  println(i);
}

迭代集合


  • 不管是在 Java 中還是在 Kotlin 中,for 循環(huán)使用最多的場(chǎng)景還是對(duì)集合的迭代。
  • 首先我們來看看在 Java 中迭代一個(gè) Map 集合,并將鍵值對(duì)打印出來。
/* Java */
 HashMap<Integer, String> map = new HashMap<>();
map.put(1, "100");
map.put(2, "200");

Set<Integer> keySet = map.keySet();

for (int key : keySet) {
  System.out.println(" key:" + key + " value:" + map.get(key));
}

>> key:1 value:100
>> key:2 value:200
  • Java 中要先獲取鍵的集合,遍歷鍵的集合,獲取對(duì)應(yīng)值。
  • 那么 Kotlin 中如何遍歷呢?
/* Kotlin */
val map = hashMapOf<Int, String>()\
map[1] = "100"
map[2] = "200"

for((key, value) in map) {
  println(" key:$key value:$value")
}

>> key:1 value:100
>> key:2 value:200
  • 怎么樣,是不是方便了很多。
  • 同時(shí),上面的代碼中還有另一個(gè)簡單的小技巧:你可以用map[key]來獲取值,也可以用map[key] = value來設(shè)置值,而不用調(diào)用get() put()方法。
  • .. 語法不僅可以創(chuàng)建數(shù)字區(qū)間,也可以創(chuàng)建字符區(qū)間 val aTof = 'a'..'f'
  • 如果要迭代一個(gè) list 集合,在 Java 中要這么做:
/* Java */
ArrayList<String> ls = new ArrayList<>();
ls.add("100");
ls.add("200");

// 只是迭代集合,打印集合中的數(shù)據(jù)
for(String str : ls) {
  System.out.println(str);
}

>> 100
>> 200

// 打印集合數(shù)據(jù)同時(shí)明確數(shù)據(jù)對(duì)應(yīng)的下標(biāo)
for(int i = 0; i < ls.size(); i++) {
  System.out.println("index:" + i + " value:" + ls.get(i));
}

>> index: 0 value: 100
>> index: 1 value: 200
  • 接下來使用 Kotlin 實(shí)現(xiàn):
/* Kotlin */
val ls = arrayListOf<String>()
ls.add("100")
ls.add("200")

for (i in 0 until ls.size) {
  println("index:$i value:${ls[i]}")
}

>> index: 0 value: 100
>> index: 1 value: 200

for ((index, value) in ls.withIndex()) {
  println("index:$index value:$value")
}

>> index: 0 value: 100
>> index: 1 value: 200
  • 這里我們又使用了一個(gè)新的方法 until,其等同于0..ls.size-1,同樣的,我們也可以使用 withIndex 方法來達(dá)到和 map 集合遍歷一樣的效果,同時(shí)獲取鍵和值。

Kotlin 中使用 in 來檢查一個(gè)值是否在區(qū)間中,或者它的逆運(yùn)算 !in。同時(shí) in 也可以作為 when 的分支。

fun checkChar(c: Char) = when(c) {
    in '0'..'9' -> "number"
    in 'a'..'z', in 'A'..'Z' -> "string"
    else -> "don't know"
}

Kotlin 中的異常


  • Kotlin 中的異常處理和 Java 中大致相同。
  • 同時(shí) Kotlin 中的 throw 結(jié)構(gòu)以及 try...catch 結(jié)構(gòu)和 Kotlin 中的 if 語句一樣是表達(dá)式,可以作為另一個(gè)表達(dá)式的一部分使用。
val num = if(n in 0..100) {
            n
          } else {
            throw IllegalArgumentException("The num value must between 0 and 100!")
          }

// 將一個(gè)字符串轉(zhuǎn)換成數(shù)字,若不是數(shù)字,返回 null
fun transform(str: String) : Int? {
  try {
    return str.toInt()
  } catch(e: NumberFormatException) {
    return null
  }
}

// 上面的方法可以寫作表達(dá)式體函數(shù)
fun transform(str: String) = try {
      str.toInt()
    } catch(e: NumberFormatException) {
      null
    }

最后


  • 今天的知識(shí)點(diǎn)就講到這,下期我們繼續(xù)。
  • 歡迎關(guān)注~
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容