CodeGym/Blog Java/Poland/Pętla For-each w Javie
Autor
Artem Divertitto
Senior Android Developer at United Tech

Pętla For-each w Javie

Opublikowano w grupie Poland

Co to jest pętla for-each?

For-each to rodzaj pętli for, która jest używana, gdy trzeba przetworzyć wszystkie elementy tablicy lub kolekcji. Właściwie samo wyrażenie for-each nie jest używane w tej pętli. Składnia jest następująca:
for (type itVar : array)
{
    // Operations
}
Gdzie type oznacza typ zmiennej iteratora (odpowiada typowi danych elementów w tablicy), itVar to jego nazwa, a array to tablica (dozwolone są również inne struktury danych, np. kolekcje takie jak ArrayList), czyli obiekt przez który przechodzi pętla. Jak widać, nie ma licznika, zmienna iteracyjna przechodzi kolejno po elementach tablicy lub kolekcji. Podczas wykonywania takiej pętli zmiennej iteracyjnej przypisywana jest sekwencyjnie wartość każdego elementu tablicy lub kolekcji, po czym wykonywany jest określony blok instrukcji (lub instrukcja). Uwaga: pętla for-each może być stosowana do tablic i wszelkich klas implementujących interfejs java.lang.Iterable. Poniższa pętla for byłaby równoważna z powyższym kodem:
for (int i=0; i < array.length; i++)
{

    // Statements
}

Przykład pętli for-each

Tworzymy tablicę ocen studentów. Następnie używamy pętli for-each, aby wyświetlić wszystkie szacunki, obliczyć średnią i znaleźć najwyższy wynik.
public class ForEachTest {

// A method that prints all scores
public static void printAllScores(int[] scores) {
        System.out.print("|");
        for (int num : scores) {

            System.out.print(num + "|");
        }
        System.out.println();
    }

// A method that displays the average score

public static double getAverageScore(int[] numbers) {
        int totalScore = 0;

        for (int num : numbers) {
            totalScore = num + totalScore;
        }
        return ((double) totalScore / numbers.length);

    }
// A method that determines the best (maximum) score
    public static int getBestScore(int[] numbers) {
        int maxScore = numbers[0];

        for (int num : numbers) {
            if (num > maxScore) {
                maxScore = num;
            }
        }
        return maxScore;
    }

public static void main(String[] args) {

// Array of scores
int[] scores = {5, 10, 7, 8, 9, 9, 10, 12};


  int bestScore = getBestScore(scores);
        System.out.print("All the scores: ");
        printAllScores(scores);
        System.out.println("The highest score is " + bestScore);
        System.out.println("The average score is " + getAverageScore(scores));
    }

}
Wynik działania programu:
All the scores: |5|10|7|8|9|9|10|12|
The highest score is 12
The average score is 8.75
Zobaczmy teraz, jak wyglądałaby metoda wyświetlająca wszystkie oceny, gdybyśmy użyli zwykłej pętli for:
public static void printAllScores(int[] scores) {
        System.out.print("|");
        for (int i = 0; i < scores.length; i++) {

            System.out.print(scores[i] + "|");
        }
        System.out.println();
    }
Jeżeli wywołamy tę metodę z metody main, otrzymamy taki wynik: Wszystkie oceny:
All the scores: |5|10|7|8|9|9|10|12|

Przykład pętli for-each z kolekcjami

Tworzymy kolekcję nazw i wyświetlamy wszystkie nazwy na ekranie.
List<String> names = new ArrayList<>();
        names.add("Snoopy");
        names.add("Charlie");
        names.add("Linus");
        names.add("Shroeder");
        names.add("Woodstock");

        for(String name : names){
            System.out.println(name);
        }

Ograniczenia pętli for-each

Kompaktowa forma pętli for-each jest uważana za łatwiejszą do odczytania niż pętla for i uznaje się, że dobrą praktyką jest używanie pętli for-each zawsze, gdy jest to możliwe. Jednak pętla for-each jest konstrukcją mniej uniwersalną niż zwykła pętla for. Oto kilka prostych przykładów, w których pętla for-each nie zadziała, albo będzie działać ale z problemami.
  1. Jeżeli chcesz uruchomić pętlę od ostatniego elementu do pierwszego. Nie ma pętli for-each, która działałby analogicznie do następującego kodu:

    for (int i= array.length-1; i>0; i--)
    {
          System.out.println(array[i]);
    }
  2. For-each nie sprawdzi się, jeżeli chcesz wprowadzić zmiany w tablicy. Na przykład nie można posortować tablicy bez zmiany położenia jej elementów. Dodatkowo, w poniższym kodzie zmienia się tylko zmienna iteratora, nie element tablicy:

    for (int itVar : array)
    {
        itVar = itVar++;
    }
  3. Jeżeli szukasz elementu tablicy i musisz zwrócić (lub przekazać dalej) indeks szukanego elementu, lepiej użyć zwykłej pętli for.

Pętle w kursie CodeGym

W CodeGym pracę z pętlami rozpoczyna się na 4. poziomie zadania Składnia Javy. Kilka lekcji na tym poziomie, a także wiele zadań na różnych poziomach, jest poświęcone pętlom, aby utrwalić Twoje umiejętności. Zasadniczo, nie można przed nimi uciec — pętle są jedną z najważniejszych konstrukcji w programowaniu. Pętla For-each w Javie - 1

Więcej informacji na temat for-each i innych pętli

  1. Instrukcja while. Ten artykuł opisuje najprostszy typ pętli: pętlę while, która w CodeGym jest używana do wprowadzenia koncepcji pętli.
  2. Przestań pisać pętle! 10 najlepszych praktyk w pracy z kolekcjami w Javie 8. Ten artykuł pomoże studentom CodeGym, którzy są przynajmniej w połowie kursu, dowiedzieć się wielu interesujących rzeczy na temat pracy z kolekcjami.
Komentarze
  • Popularne
  • Najnowsze
  • Najstarsze
Musisz się zalogować, aby dodać komentarz
Ta strona nie ma jeszcze żadnych komentarzy