Kurs Java #8 Pętle

Java

Loading

Kurs Java #8 Pętle to kolejny wpis z naszego cyklu wpisów o Javie. Pętle w programowaniu pozwalają powtarzać fragmenty kodu bez konieczności pisania ich na okrągło. Pętle w Java odgrywają kluczową rolę w kontrolowaniu przepływu programu i automatyzacji powtarzalnych zadań. Bez nich codzienne operacje, takie jak przetwarzanie danych czy iterowanie po kolekcjach, byłyby nie tylko żmudne, czasochłonne, ale wręcz nierealne do efektywnego wdrożenia.

W Javie mamy cztery główne rodzaje pętli:

  • forklasyczna pętla do zadań, w których znasz liczbę iteracji
  • while gdy nie wiesz, ile razy kod powinien się wykonać
  • do-while gdy chcesz mieć pewność, że kod wykona się przynajmniej raz,
  • for-each – specjalna wersja pętli do przechodzenia przez tablice i kolekcje

W tym artykule przyjrzymy się każdej z nich, pokażemy różnice i podpowiemy, kiedy warto użyć której.

Wprowadzenie

Każdy, kto zaczyna przygodę z Javą, szybko natrafi na temat pętli. To one pozwalają automatycznie wykonywać te same instrukcje wielokrotnie, aż do momentu, gdy spełniony zostanie określony warunek. Dzięki pętli możesz obsłużyć kod zawarty w kilku linijkach, który ręcznie wymagałby dziesiątek czy setek powtórzeń.
Wyobraź sobie, że chcesz wydrukować liczby od 1 do 100. Mógłbyś to zrobić 100 razy ręcznie, ale wykorzystując pętle można to zrobić szybciej i zajmie to tylko kilka linijek kodu. Praktycznie pętla zrobi to za nas.

Pętla for

Pętla for w Javie jest podstawową konstrukcją służącą do wielokrotnego wykonywania fragmentu kodu, szczególnie gdy z góry wiemy, ile razy dana operacja ma się powtórzyć Jest bardzo popularna przy pracy z tablicami, listami czy wykonywaniu powtarzalnych obliczeń.

Budowa pętli for:

for (inicjalizacja; warunek; modyfikacja) {
    // kod do wykonania
}
  • inicjalizacja – jest wykonywana raz, przed rozpoczęciem pętli. Najczęściej inicjalizujemy tu zmienną sterującą, np. int i = 0.
  • warunek – jest sprawdzany przed każdym przejściem pętli. Jeśli jest prawdziwy, kod w pętli się wykonuje. Jeśli nie, pętla kończy działanie.
  • modyfikacja – jest wykonywana po każdym przejściu pętli. Najczęściej zwiększamy lub zmniejszamy licznik, np. i++ lub i--.

Przykład:

Wyjaśnienie:

  • int i = 1 – zaczynamy od 1,
  • i <= 5 – dopóki i jest mniejsze lub równe 5,
  • i++ – po każdej iteracji zwiększamy i o 1.

Pętla while

Pętla while w Javie pozwala wielokrotnie wykonywać blok kodu, dopóki określony warunek logiczny jest spełniony (czyli ma wartość true). Jest szczególnie przydatna wtedy, gdy nie wiemy z góry, ile razy kod powinien się wykonać – pętla działa tak długo, jak długo spełniony jest warunek.

Budowa pętli while:

while (warunek) {
   // kod do wykonania tzw. ciało pętli
}
  • warunekwyrażenie logiczne, które jest sprawdzane przed każdą iteracją pętli.
  • ciało pętli – jeśli warunek jest prawdziwy, wykonywane jest ciało pętli, a jeśli fałszywy – pętla kończy działanie.

Przykład:

Wyjaśnienie:

  • int x = 1 – zaczynamy od 1 (inicjalizacja zmiennej przed pętlą),
  • x <= 5 – dopóki x jest mniejsze lub równe 5, wykonuj ciało pętli (warunek sprawdzany przed każdą iteracją),
  • x++ – po każdej iteracji zwiększamy x o 1 (modyfikacja zmiennej sterującej wewnątrz pętli).

Podsumowując: pętla while w tym przykładzie wykonuje swój blok kodu pięć razy, za każdym razem zwiększając wartość zmiennej sterującej i sprawdzając warunek przed kolejną iteracją.

Pętla do-while

Pętla do-while w Javie zapewnia, że blok kodu wykona się przynajmniej raz – nawet jeśli warunek na starcie jest fałszywy. Warunek sprawdzany jest dopiero po pierwszym wykonaniu ciała pętli.

Budowa pętli do-while:

do { 
// kod do wykonania tzw. ciało pętli
} while (warunek);
  • ciało pętli – kod wewnątrz bloku do wykona się zawsze przynajmniej raz, niezależnie od warunku.
  • warunek – wyrażenie logiczne, które jest sprawdzane po każdej iteracji; jeśli jest prawdziwy, pętla wykona się ponownie, jeśli fałszywy – zakończy działanie.

Przykład:

Wyjaśnienie:

  • int x = 1 – zaczynamy od 1 (inicjalizacja zmiennej przed pętlą),
  • wykonujemy ciało pętli: wypisujemy liczbę i zwiększamy ją o 1,
  • liczba <= 5 – po każdej iteracji sprawdzamy warunek; jeśli liczba jest mniejsza lub równa 5, pętla wykona się ponownie.

W pętli do-while kod w bloku wykona się zawsze przynajmniej jeden raz, nawet jeśli warunek od początku jest fałszywy.

Pętla for-each

Pętla for-each (enhanced for loop) to wygodny sposób na przechodzenie po wszystkich elementach tablicy lub kolekcji – bez konieczności ręcznego operowania indeksem. Jest czytelna i minimalizuje ryzyko błędów związanych z dostępem do elementów poza zakresem.

Budowa pętli for-each:

for (typ zmienna : kolekcja) { 
// kod
}
  • typ zmiennatyp danych przechowywanych w tablicy lub kolekcji (np. intString).
  • kolekcja – tablica lub kolekcja, po której chcemy przejść.
  • ciało pętli – kod wykonywany dla każdego elementu z kolekcji.

Przykład:

Wyjaśnienie:

  • Dla każdego elementu tablicy numbers, zmienna number przyjmuje jego wartość i wykonywane jest ciało pętli.

Pętlę for-each używamy gdy chcemy przejść przez wszystkie elementy tablicy lub kolekcji i nie potrzebujemy znać indeksu. Pętlę użyjemy przy pracy z listami, zbiorami, mapami (po kolekcji wartości). Dzięki niej kod jest krótki i czytelny.

Pętle nieskończone

Nieskończona pętla to taka, która nigdy się nie kończy, ponieważ nie istnieje lub nie został spełniony warunek. Czasami jest to błąd, ale nie zawsze. W niektórych sytuacjach wywołanie nieskończonej pętli jest zamierzone, lecz niekontrolowane jej użycie obciąża procesor i może doprowadzić do zablokowania aplikacji.

Przykłady:

while (true) {
System.out.println("Nieskończona pętla while.");
}
for (;;) {
System.out.println("Nieskończona pętla for.");
}
for (int i = 1; i <= 5;) {
System.out.println(i);
// brak i++ powoduje, że i jest zawsze równe 1 więc pętla jest nieskończona
}

Są sytuacje, gdy nieskończona pętla jest celowa np. serwer oczekujący na połączenia, gra czekająca na ruch gracza, aplikacja reagująca na zdarzenia. Przy tworzeniu takiej pętli musimy być pewni, że w pewnym momencie zapewnimy jej wyście np. przez break, czy wciśnięciu klawiszy na klawiaturze Ctrl + C w konsoli i zakończeniu zadania.

Przykład pętli nieskończonej celowo:

Na początku tworzony jest obiekt klasy Scanner, który umożliwia odczytywanie danych wpisywanych przez użytkownika do konsoli. Następnie rozpoczyna się pętla while, której warunek to true, czyli zawsze prawdziwy – co czyni ją pętlą nieskończoną. Użytkownik proszony jest o wpisanie dowolnego tekstu. Jeśli wpisze inne słowo niż „exit”, program wypisze wprowadzone dane i przejdzie do kolejnej iteracji pętli. Gdy jednak użytkownik wpisze „exit” (niezależnie od wielkości liter), zostanie wyświetlony komunikat o zakończeniu działania programu, a pętla zostanie przerwana za pomocą instrukcji break. Choć technicznie pętla jest nieskończona, to jej zakończenie jest w pełni kontrolowane przez użytkownika, który może ją przerwać poprzez wpisanie odpowiedniego polecenia w konsoli.

Podsumowanie

Pętle to nieodłączony element programowania w Java. Pozwalają uproszczać powtarzalne czynności, przetwarzać dane, sterować logiką aplikacji i oszczędzać czas programisty. W artykule poznaliśmy trzy podstawowe rodzaje pętli: for, while, do-while oraz for-each. Dowiedzieliśmy się jak działają poszczególne pętle i kiedy warto ich używać oraz czym się różni pętla nieskończona od zwykłej.

Niektóre kwestie na tym etapie mogą być jeszcze niejasne, ale z upływem czasu i praktyki staną się bardziej zrozumiałe i intuicyjne. Prawidłowe używanie pętli to jeden z sposobów na pisanie efektywnego, czytelnego i elastycznego kodu.

O autorze

Adam Mingielewicz

Tester oprogramowania z pasją do jakości i technologii. Łączy doświadczenie w testach manualnych i automatycznych, koncentrując się przede wszystkim na aplikacjach webowych oraz usługach SOAP i REST. Testowanie to dla niego nie tylko szukanie błędów, ale przede wszystkim kwestionowanie przyjętych założeń i usprawnianie tego, co nie działa – również w samym procesie testowym. Lubi zmieniać, angażować się i aktywnie budować proces testowy, tak by miał sens, a nie tylko formę. Prywatnie fan rocka, biwakowania, podróży.