Докато преобразувах целия си java код в kotlin, една от странните промени в синтаксиса, които наблюдавах, беше цикълът for
и в двата езика. По-късно, с помощта на kotlin docs, разбрах, че има няколко концепции, които са напълно различни от java или всеки друг език for
цикли.
This post was originally posted at https://agrawalsuneet.github.io/blogs/kotlin-for-loop/ and reposted on Medium on 12th Jan 2018.
Изчакайте! Те не са толкова здрави. Всъщност те са много лесни, интересни и полезни.
Нека проверим един по един.
- Прост
for
цикъл в java, който итерира от някакво число до някакво число, увеличавайки единица при всяко преминаване на цикъла.
for (int i = 0; i <= 10; i++){ System.out.print(i); }
неговия еквивалентен код на Kotlin
for (i in 0..10) { print(i) }
Неща за отбелязване
- няма нужда да декларирате типа данни на променливата
- ако итерираме в диапазон, можем да използваме променлива
in
- долната и горната (включително) граница могат да бъдат определени от двете страни на оператора
..
.
2. Сега да кажем, че ако не искам, не искам да включа горната граница в цикъла и да прекъсна цикъла, ако достигне горната граница.
for (int j = 0; j < 10; j++) { System.out.print(j); //this will print only up to 9 }
Има два начина да направите същото в kotlin, първият е да намалите горната граница, докато кодирате и да използвате оператор ..
или друг начин е да използвате оператор until
.
for (j in 0..9) { print(j) } for (j in 0 until 10) { print(j) }
И двамата правят едно и също нещо.
3. Искам да го увелича с 2 или друго число.
for (int i = 0; i <= 10; i += 2) { System.out.print(i); }
Тук можем да използваме оператор step
for (i in 0..10 step 2) { print(i) }
4. Чакай, какво ще стане, ако искам да стартирам цикъла в обратен ред. Мога ли да използвам 10..1
?
for (int i = 10; i > 0; i--) { System.out.print(i); }
Не, не можете да използвате 10..1
, тъй като операторът ..
никога не работи на обратните диапазони. Това няма да ви даде грешка във времето за компилиране или изпълнение, а просто пропуска циклите, като проверява условията, които ще бъдат неверни всеки път. Трябва да използвате оператор downTo
.
for (i in 10 downTo 1) { print(i) }
Можете също да промените размера на стъпката с оператора step
.
Java for (int i = 10; i > 0; i -= 3) { System.out.print(i); } Kotlin for (i in 10 downTo 1 step 3) { print(i) }
Но имайте предвид, че операторът until
не работи тук. Операторът until
може да се използва само за нарастване напред.
5. Ами ако имам сложно изчисление вместо събиране или изваждане във всяка стъпка. Да кажем умножение или деление.
for (int k = 2; k <= 256; k *= 2) { System.out.print(k); }
Преминете към цикъла while, няма друг начин
var k = 2 while (k <= 256) { print(k) k *= 2 }
6. Сега искам да обходя масив.
int[] arr = new int[5]; for (int i = 0; i < arr.length; i++) { System.out.print(arr[i]); }
Просто, използваме indices
в kotlin
val arr = IntArray(5) for (i in arr.indices) { print(arr[i]) }
Чух и за някои за for each
. Мога ли да използвам същото в kotlin?
int[] arr = new int[5]; for (int item: arr) { System.out.print(item); }
Да, можеш. Цикълът for
итерира всичко, което предоставя итератор. Цикъл for
върху масив се компилира до цикъл, базиран на индекс, който не създава обект на итератор.
for(item in arr){ print(item) }
7. А какво да кажем за List?
List<Integer> arrayList = new ArrayList<>(); for (int i = 0; i < arrayList.size(); i++) { System.out.print(arrayList.get(i)); } List<Integer> vector = new Vector<>(); for (int i = 0; i < vector.size(); i++) { System.out.print(vector.get(i)); }
просто. Използвайте итерация, базирана на indices
.
val arrayList = ArrayList<Int>() for (i in arrayList.indices) { print(arrayList[i]) } val vector = Vector<Int>() for (i in vector.indices) { print(vector[i]) }
Не, аз съм фен на for each
цикъл.
for (int item : arrayList) { System.out.print(item); } for (int item : vector) { System.out.print(item); }
Добре, няма проблем, ето го.
for (item in arrayList) { print(item) } for (item in vector) { print(item) }
8. Можете също да използвате функцията библиотека withIndex
for ((i, value) in arr.withIndex()) { println(“the element at $i is $value”) }
Обикновено не се нуждаете от функцията withIndex
за итерация.
И сме готови. Вижте, казах ви, че ще бъде много лесно и интересно.
Това е всичко за сега. Можете да прочетете другите ми интересни публикации тук или можете да се насладите на моите игри или приложения, изброени тук. Чувствайте се свободни да използвате моите Android компоненти с отворен код във вашето приложение, посочено тук. Или пуснете „имейл“, ако не сте намерили това, което търсите и имате нужда от помощ.