Pniemy się coraz wyżej z Kotlinem! Na dzisiejszy dzień przygotowałem dla Was materiał poświęcony nieco ciekawszemu zagadnieniu. Dowiecie się jak funkcjonuje pętla "for" w języku Kotlin, do czego ona służy, jak ją rozumieć, czym się różni programowanie tutaj od składni w języku Java i jakie są jej najlepsze zastosowania. Wchodźcie, a nie pożałujecie!

PĘTLA "FOR" W JĘZYKU KOTLIN I NIESTANDARDOWE SPOSOBY ZAPISU

Trzeba nadmienić, że pętla "for" tutaj mocno odbiega od "starszego brata" i tylko z powodu różnic składniowych podjąłem decyzję o rozpisaniu się na ten temat. Kotlin nie powiela tradycyjnego "C-owego" podejścia jakie znacie z Javy. Na przykład to, co znacie z języka Java:

for (int i = 1; i <= 10; ++i)
{
	System.out.println(i)
}

w Kotlinie trzeba zapisać tak:

for (i in 1..10)
{
	println(i)
}

Jest różnica, prawda? Bezapelacyjnie. Pokażę Wam teraz kilka różnych wariantów zapisu oraz ich odpowiedniki w Javie. Zawsze dobrze jest to sobie porównać do czegoś, co się widzi na oczy już od lat, a Kotlin to jeszcze "świeżak".

ODMIANY PĘTLI "FOR"

ZAKRES <A; B>

Pierwszą z nich już widzieliście. Po słowie kluczowym "in" można podać zakres liczb od A do B. Zapis:

1..10

spowoduje wykonanie dziesięciu iteracji (powtórzeń) w pętli. Pomiędzy liczbami "stoi" operator w postaci dwóch kropek postawionych obok siebie. Jest to operator dla ustalania zakresu liczb. Gdybyśmy chcieli dać od jednego do stu, to piszecie:

1..100

Jak na razie, banał. Przedstawiony przed sekundą zapis uwzględnia górną granicę. To znaczy, że iteracja rozpocznie od liczby 1 i wykona się sto razy. Gdybyśmy chcieli, aby pętla "for" w języku Kotlin "przeszła" N razy bez uwzględniania górnej granicy, trzeba skorzystać już z całkowicie innego zapisu.

ZAKRES <A; B)

W Javie, zmieniłoby się tylko znak "mniejsze bądź równe od" na "samo" "mniejsze od":

for (int i = 1; i < 100; ++i)
{
	System.out.println(i)
}

A jak w Kotlinie? Cóż…

for (i in 1 until 100)
{
	println(i)
}

Wtedy ze słowa "until" korzystacie. Zastosowanie słowa "until" pozwala wykonać (N - 1) iteracji z wykluczeniem górnej granicy, czyli w tym przypadku nie zostanie wykonana pętla dla liczby 100 (zakres będzie od 1 do 99).

ZAKRES <A; B> Z PRZESKOKIEM CO N LICZB

Pamiętacie zapewne drodzy programiści Javy, że licznik w pętli wcale nie musi być zwiększany o jedną jednostkę. Można też dla przykładu zrobić przeskok o dwa:

for (int i = 1; i <= 100; i += 2)
{
	System.out.println(i)
}

Taka pętla "for" w języku Kotlin to już przybrałaby następującą postać:

for (i in 1..100 step 2)
{
	println(i)
}

Że co?! Kolejny "keyword"? W rzeczy samej! "step" wyznacza o ile jednostek do góry ma nastąpić "skok" licznika co iterację. Domyślnie jest o jeden, a dzięki temu słowu możemy dać ile chcemy, przy czym gdybyśmy chcieli iterować w drugą stronę, to robimy to przy użyciu INNEGO słowa.

ZAKRES <A; B> DO DOŁU

Nieraz możecie potrzebować iterowania w drugą stronę, czyli od większej liczby do mniejszej. Pozwólcie, że Wam to zobrazuję "po Javowemu":

for (int i = 100; i >= 0; --i)
{
	System.out.println(i)
}

Po angielsku to się nazywa "countdown". Odpowiednik Kotlina? Tylko się nie zdziwcie:

for (i in 100 downTo 0)
{
	println(i)
}

Tym razem macie "downTo". To jest słowo kluczowe zmieniające kierunek iterowania na przeciwny (ujemny) z jednoczesnym dostosowaniem na której liczbie ma się zatrzymać. "downTo 1" sprawi, że ostatnia iteracja będzie wykonywana na liczniku równym 1 i tak dalej.

ZAKRES <A; B> DO DOŁU Z PRZESKOKIEM CO N LICZB

Kotlin pozwala na połączenie iterowania w dół z ustaleniem własnego przeskoku czyli połączenie słów "downTo" ze "step". Tak by to wyglądało w języku Java:

for (int i = 100; i >= 0; i += 4)
{
	System.out.println(i)
}

a tak jest w języku Kotlin:

for (i in 100 downTo 0 step 4)
{
	println(i)
}

Wiem. Ciężko można nawet myśleć o przestawieniu się na zupełnie inny sposób zapisu, natomiast taki obowiązuje w tym języku a moją misją jest przekazanie maksimum rzetelnej wiedzy w kierunku jakim jest programowanie.

ITEROWANIE PO TABLICY (ELEMENTY)

To nie koniec wrażeń jakie zapewnia pętla "for" w języku Kotlin. A co z tablicami i słynną "pętlą rozszerzoną" znaną z Javy również pod hasłem "for each"? Chwilunia, zaraz rozjaśnię sytuację:

for (Integer n : numbers)
{
	System.out.println(n);
}

O to mi chodzi. Tutaj wyjątkowo można napatoczyć się na dużo łatwiejszą składnię niż poprzednie zapisy. Oto "Kotlinowe" podejście:

for (n in numbers)
{
	println(n)
}
ITEROWANIE PO TABLICY (INDEKSY)

Teraz zapis mogący znacznie pocieszyć tych, którzy nie mogą się otrząsnąć z powyższych kombinacji słów kluczowych. Hej, drodzy koledzy od Javy. Pamiętacie jeszcze tę upierdliwą bolączkę kiedy to trzeba było przestawiać się na tradycyjną pętlę "for" celem iterowania po indeksach tablicy?

for (int i = 0; i < numbers.length; ++i)
{
	System.out.println(i);
}

Na kłopoty Kotlin! Oto co on na ten temat "sądzi":

for (i in numbers.indices)
{
	println(i)
}

Tablica posiada właściwość "indices" dzięki której zwracana jest osobna tablica w postaci takiego samego zakresu jaki widzieliście na samym początku:

0..(N - 1)
ITEROWANIE PO TABLICY (ELEMENT + INDEKS JEDNOCZEŚNIE)

Przed nami ostatni wariant jaki oferuje pętla "for" w języku Kotlin. Iterowanie po indeksie i elemencie naraz. Java i w tym przypadku każe skorzystać z zapisu tradycyjnego:

for (int i = 0; i < numbers.length; ++i)
{
	System.out.println("Indeks: " + i + " Liczba: " + numbers[i]);
}

Co na to Kotlin? Kotlin "widzi" to jeszcze prościej:

for ((i, n) in numbers.withIndex())
{
	println("Indeks: $i, Liczba: $n")
}

Metoda "withIndex" to takie dwa w jednym. W wygodny dla człowieka sposób potrafi zwrócić parę zmiennych, osobno dla indeksu oraz dla elementu.

Pętla "for" w języku Kotlin dla tablicy Pętla "for" w języku Kotlin z właściwością "indices" Pętla "for" w języku Kotlin z metodą "withIndex"

Kotlin znacznie upraszcza programowanie oferując wygodniejsze zapisy pętli "for" obsługujących tablicę i kolekcję. W przypadku wykonania N powtórzeń, operuje na zbiorze liczb, a na każdy przypadek jest przeznaczone osobne słowo kluczowe.


Mamy kolejny wątek z głowy. Pętla "for" w języku Kotlin rządzi się swoimi prawami co do sposobu zapisu, aczkolwiek w kwestii iterowania po kolekcji danych potrafi znacznie uprościć sprawę bez sięgania do podstawowych metod.

PODOBNE ARTYKUŁY