Artem Divertitto
Senior Android Developer bei United Tech

Die for-each-Schleife in Java

Veröffentlicht in der Gruppe Germany

Was ist eine for-each-Schleife?

for-each ist eine Art for-Schleife, die du verwendest, wenn du alle Elemente eines Arrays oder einer Collection verarbeiten musst. Allerdings wird der Ausdruck for-each in dieser Schleife eigentlich nicht verwendet. Die Syntax lautet wie folgt:

for (type itVar : array)
{
    // Operationen
}
Wobei type der Typ der Iterator-Variable ist (der dem Datentyp der Elemente im Array entspricht!), itVar ihr Name und array ein Array (andere Datenstrukturen sind auch erlaubt, z. B. eine Collection, wie ArrayList), d. h. das Objekt, auf dem die Schleife ausgeführt wird. Wie du siehst, wird bei diesem Konstrukt kein Zähler verwendet: Die Iterator-Variable iteriert einfach über die Elemente des Arrays oder der Collection. Wenn eine solche Schleife ausgeführt wird, wird der Iterator-Variable nacheinander der Wert jedes Elements des Arrays oder der Collection zugewiesen, woraufhin der angegebene Anweisungsblock (oder die Anweisung) ausgeführt wird. Hinweis: Eine for-each-Schleife kann auf Arrays und alle Klassen angewendet werden, die das Interface java.lang.Iterable implementieren. Die folgende for-Schleife würde dem obigen Code entsprechen:

for (int i=0; i < array.length; i++)
{

    // Anweisungen
}

Beispiel für eine for-each-Schleife

Wir erstellen ein Array mit Punktzahlen von Schülern. Dann verwenden wir eine for-each-Schleife, um alle Werte auszudrucken, die durchschnittliche Punktzahl zu berechnen und die höchste Punktzahl zu ermitteln.

public class ForEachTest {

  // Eine Methode, die alle Werte ausgibt

  public static void printAllScores(int[] scores) {
        System.out.print("|");
        for (int num : scores) {

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

  // Eine Methode, die die durchschnittliche Punktzahl anzeigt

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

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

    }
  // Eine Methode, die die beste (höchste) Punktzahl ermittelt

    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 von Punktzahlen
  int[] scores = {5, 10, 7, 8, 9, 9, 10, 12};


  int bestScore = getBestScore(scores);
  System.out.print("Alle Punktzahlen: ");
  printAllScores(scores);
  System.out.println("Die höchste Punktzahl ist " + bestScore);
  System.out.println("Die durchschnittliche Punktzahl ist " + getAverageScore(scores));
  }

}
Programmausgabe:
Alle Punktzahlen: |5|10|7|8|9|9|10|12| Die höchste Punktzahl ist 12 Die durchschnittliche Punktzahl ist 8.75
Sehen wir uns nun an, wie eine Methode zum Ausgeben aller Punktzahlen aussehen würde, wenn wir eine gewöhnliche for-Schleife verwenden würden:

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();
    }
Wenn wir diese Methode von der main-Methode aus aufrufen, erhalten wir dieses Ergebnis:
Alle Punktzahlen: |5|10|7|8|9|9|10|12|

Beispiel für eine for-each-Schleife mit Collections

Wir erstellen eine Collection von Namen und zeigen alle Namen auf dem Bildschirm an.

List<String> names = new ArrayList<>();
        names.add("Snoopy");
        names.add("Charlie");
        names.add("Linus");
        names.add("Schroeder");
        names.add("Woodstock");

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

Beschränkungen einer for-each-Schleife

Die kompakte Form der for-each-Schleife gilt als einfacher zu lesen als eine for-Schleife, und es gilt als Best Practice, wann immer möglich eine for-each-Schleife zu verwenden. Eine for-each-Schleife ist jedoch ein weniger universelles Konstrukt als eine gewöhnliche for-Schleife. Hier sind einige einfache Fälle, in denen eine for-each-Schleife entweder gar nicht oder nur mit Schwierigkeiten funktioniert.
  1. Wenn du eine Schleife vom Ende zum Anfang durchlaufen willst. Das heißt, es gibt keine for-each-Schleife, die eine direkte Entsprechung zum folgenden Code wäre:

    
    for (int i= array.length-1; i>0; i--)
    {
          System.out.println(array[i]);
    }
    
  2. for-each ist nicht geeignet, wenn du Änderungen an einem Array vornehmen willst. Du kannst zum Beispiel ein Array nicht sortieren, ohne die Position der Elemente zu ändern. Außerdem ändert sich im folgenden Code nur die Iterator-Variable, nicht das Element des Arrays:

    
    for (int itVar : array)
    {
        itVar = itVar++;
    }
    
  3. Wenn du nach einem Element in einem Array suchst und den Index des gesuchten Elements zurückgeben (oder weitergeben) musst, dann ist es besser, eine gewöhnliche for-Schleife zu verwenden.

Schleifen im CodeGym-Kurs

Bei CodeGym beginnen wir mit dem Üben von Schleifen auf Level 4 der Java Syntax Quest. Mehrere der Lektionen auf diesem Level sowie viele der Aufgaben in den verschiedenen Levels sind Schleifen gewidmet, um deine Fähigkeiten im Umgang mit ihnen zu stärken. Im Grunde gibt es keine Möglichkeit, ihnen zu entkommen – Schleifen sind eines der wichtigsten Konstrukte in der Programmierung. Die for-each-Schleife in Java - 1

Mehr Informationen über for-each und andere Schleifen

  1. Die while-Anweisung. In diesem Artikel geht es um die einfachste Art von Schleife: die while-Schleife, die CodeGym verwendet, um den Teilnehmern Schleifen vorzustellen.
  2. Hör auf, Schleifen zu schreiben! 10 Tipps für die Arbeit mit Collections in Java 8. Dieser Artikel hilft CodeGym-Teilnehmern, die mindestens die Hälfte des Kurses absolviert haben, viele interessante Dinge über die Arbeit mit Collections zu lernen.
Kommentare
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION