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.