Nasza strona używa cookies. Korzystając ze strony, wyrażasz zgodę na używanie cookies, zgodnie z aktualnymi ustawieniami przeglądarki. Rozumiem

Jak działa pętla for w Kotlinie

Suneet Agrawal Engineering Lead / ShareChat
Dowiedz się, jak poprawnie korzystać z pętli for w Kotlinie na przykładzie kilku konkretnych przypadków użycia.
Jak działa pętla for w Kotlinie

Podczas przekształcania mojego kodu w Javie na Kotlina, zauważyłem jedną ciekawą zmianę w składni obu języków —  pętlę for. Z pomocą dokumentacji Kotlina zdałem sobie sprawę, że jest kilka rzeczy, które sprawiają, że pętla for jest tam trochę inna niż w pozostałych językach. Nie ma tutaj nic szczególnie trudnego —  są to nawet bardzo przydatne i interesujące rzeczy. Sprawdźmy więc, jak używać pętli for w Kotlinie na konkretnych przykładach. 


Oto prosta pętla for w Javie, która iteruje od jednej liczby do drugiej, zwiększając ją o jeden przy każdym przebiegu pętli.

for (int i = 0; i <= 10; i++){
    System.out.print(i);
}



A oto jej odpowiednik w Kotlinie:

for (i in 0..10) {
    print(i)
}


Wnioski:

  • nie ma potrzeby deklarowania typu danych zmiennej
  • iterując po zakresie, możemy użyć in, aby powiązać kolejne elementy ze zmienną
  • Dzięki użyciu .. tworzymy range, który wyznacza dolny i górny limit iteracji.


Powiedzmy, że chcemy wyjść z pętli, zanim licznik osiągnie górną, graniczną wartość:

for (int j = 0; j < 10; j++) {
    System.out.print(j); //this will print only up to 9
 }


W Kotlinie można zrobić powyższe na dwa sposoby: zmniejszyć wartość limitu i użyć operatora .. lub użyć operatora until

for (j in 0..9) {
    print(j)
 }
for (j in 0 until 10) {
    print(j)
 }


Obydwa sposoby dają nam to samo.


Chcemy teraz inkrementować licznik o 2 (czy też inną liczbę)

for (int i = 0; i <= 10; i += 2) {
    System.out.print(i);
 }


Używamy tutaj operatora step.

for (i in 0..10 step 2) {
    print(i)
 }


A co jeśli chcę uruchomić pętlę w odwrotnej kolejności? Czy mogę użyć 10..1?

for (int i = 10; i > 0; i--) {
    System.out.print(i);
 }


Nie możesz użyć 10..1, bo nie jest to zgodne z tym, jak działają zakresy w Kotlinie. Nie otrzymasz wtedy czasu kompilacji, czy błędu przy starcie. Nie otrzymasz błędu w czasie kompilacji, czy uruchomienia, ale pętla zostanie po prostu pominięta. Warunek wejścia do pętli nie zostanie spełniony. Musisz tutaj użyć operatora downTo.  

for (i in 10 downTo 1) {
    print(i)
 }


Tu też możesz zmienić wartość kroku przy użyciu operatora 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)
}


Pamiętaj jednak, że operator until tutaj nie zadziała. Może być on tylko użyty do inkrementowania do przodu.


A co jeśli mam jakieś złożone obliczenie zamiast dodawania lub odejmowania w każdym kroku, np. mnożenie lub dzielenie?

for (int k = 2; k <= 256; k *= 2) {
    System.out.print(k);
 }


Trzeba tutaj skorzystać z pętli while

var k = 2
while (k <= 256) {
   print(k)
   k *= 2
}


Teraz chcemy iterować po tablicy

int[] arr = new int[5];
for (int i = 0; i < arr.length; i++) {
    System.out.print(arr[i]);
}


Do tego użyjemy funkcji indices.

val arr = IntArray(5)
for (i in arr.indices) {
    print(arr[i])
} 


A co z for each. Czy mogę użyć takiej konstrukcji w Kotlinie?

int[] arr = new int[5];
for (int item: arr) {
    System.out.print(item);
 }


Jasne, że mogę. Pętla for przeiteruje po wszystkim, co jest w stanie dostarczyć iterator. Natomiast pętla for użyta na tablicy zostanie skompilowana jako pętla oparta na indeksach, bez tworzenia obiektu iteratora.

for(item in arr){
    print(item)
 }


A co z 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));
 }


Tutaj użyjemy iteracji opartej na 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])
}


Osobiście jestem fanem użycia for each.

for (int item : arrayList) {
System.out.print(item);
}

for (int item : vector) {
System.out.print(item);
}


Co w Kotlinie będzie wyglądać w taki sposób:

for (item in arrayList) {
    print(item)
}
for (item in vector) {
    print(item)
}

 

Możesz też użyć funkcji withIndex

for ((i, value) in arr.withIndex()) {
    println(“the element at $i is $value”)
}


Normalnie jednak nie robi się tego w ten sposób i lepiej będzie wyglądać, jeżeli użyjemy któregoś z wcześniejszych podejść.

No i tyle. Mam nadzieję, że powyższe rzeczy były naprawdę interesujące. 


Jeżeli jesteście zainteresowani innymi artykułami, znajdziecie je tutaj. Moje gry i aplikacje są tutaj. Zapraszam też do korzystania z komponentów open-source Androida tutaj.


Oryginał tekstu w języku angielskim możesz przeczytać tutaj

Rozpocznij dyskusję

Lubisz dzielić się wiedzą i chcesz zostać autorem?

Podziel się wiedzą z 160 tysiącami naszych czytelników

Dowiedz się więcej