本節(jié)介紹 Kotlin 的循環(huán)語法拟赊。
下面的示例是我們最熟悉的循環(huán)語法,但是這種語法在 Kotlin 中是不能使用的顾复。
不過沒有關(guān)系贡耽,在 Kotlin 中有更多適合的語法供我們選擇。
以下列出 5 種 Kotlin 中常用的循環(huán)語法:
常用的循環(huán)語法
第一種指黎,其中聲明一個(gè) i 用于迭代朋凉,之后 1..10 表示的是從 1 到 10 的閉區(qū)間(1 <= x <=10)
當(dāng)我們把循環(huán) 1 到 10 改成 10 到 1 時(shí),發(fā)現(xiàn)編譯器發(fā)出警告醋安,說我們的區(qū)間是空的杂彭,你的意思是不是使用 downTo
關(guān)鍵字。這就說明吓揪,關(guān)鍵字 ..
只能用遞增的循環(huán)亲怠,如果使用遞減的循環(huán)應(yīng)使用 downTo
。
第二種柠辞,1 until 10 表示的是從 1 到 10 的半開區(qū)間(1 <= x < 10)
我們看下 until
的原型聲明:
在 Kotlin 庫中找到 kotlin.ranges._Ranges.kt 類团秽,會發(fā)現(xiàn)其實(shí)是給 Int、Long叭首、Byte 等等聲明了對應(yīng)的擴(kuò)展函數(shù):
從它的執(zhí)行步驟來看:
第一步檢查你傳入的值是否是一個(gè)合法的值习勤,否則直接返回 EMPTY,如果合法的話其實(shí)就是將 to 值減 1 后調(diào)用了 ..
的函數(shù)焙格,我們點(diǎn)開 ..
函數(shù)图毕,發(fā)現(xiàn)它就是對應(yīng)的 rangeTo 函數(shù)。
第三種眷唉,上面已經(jīng)提到予颤,10 downTo 1 表示遍歷從 10 到 1 的閉區(qū)間(10 <= x <= 1)
查看 downTo
對應(yīng)擴(kuò)展函數(shù)也能清楚的知道它的含義,從當(dāng)前的 this 到 to 值按照步長 -1 循環(huán)遞減冬阳。
第四種蛤虐,帶有步長 step 的循環(huán),相當(dāng)于 Java for 循環(huán)中的 count += 2摩泪。
同樣的笆焰,調(diào)用的還是上面提到的方法,只不過加入了步長见坑。
第五種嚷掠,Kotlin 提供了海量的擴(kuò)展函數(shù)捏检,其中有一個(gè)擴(kuò)展函數(shù) repeat 可以用來循環(huán):
實(shí)際上,這個(gè)函數(shù)其實(shí)就是封裝了一層 for-in 形式的循環(huán)不皆,允許你傳入一個(gè) Lambda 閉包用來執(zhí)行對應(yīng)的代碼贯城。
遍歷集合
我們知道循環(huán)大多數(shù)用于集合,針對集合 for-in 形式的循環(huán)可直接把 list 中的元素取出:
特別的霹娄,Kotlin 還允許我們使用解構(gòu)的形式來獲取對應(yīng)的 index 和 value:
需要注意的是能犯,如果我們使用的是 map 的話是可以直接使用解構(gòu)的(前面的解構(gòu)文章有提到),但是如果使用的是 list犬耻,則需要先調(diào)用 list 的 withIndex 方法踩晶,它可以為我們返回一個(gè)迭代器:
迭代器的泛型參數(shù)是 IndexedValue,它實(shí)際上是一個(gè)聲明了 index 和 對應(yīng) value 的數(shù)據(jù)類枕磁!這樣就解釋了 list 使用 withIndex 來生成可解構(gòu)的迭代器渡蜻。
以上就是本節(jié)內(nèi)容,歡迎大家關(guān)注~