Докато преобразувах целия си 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.

Изчакайте! Те не са толкова здрави. Всъщност те са много лесни, интересни и полезни.
Нека проверим един по един.

  1. Прост 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 компоненти с отворен код във вашето приложение, посочено тук. Или пуснете „имейл“, ако не сте намерили това, което търсите и имате нужда от помощ.