1729 Stimmen

Wie funktioniert die Java-'for each'-Schleife?

Bedenken Sie:

List<String> someList = new ArrayList<String>();
// add "monkey", "donkey", "skeleton key" to someList

for (String item : someList) {
    System.out.println(item);
}

Was wäre das Äquivalent for Schleife aussehen, ohne die Verwendung der für jede Syntax?

49voto

akhil_mittal Punkte 20953

Gemäß der Definition in JLS for-each-Schleife kann zwei Formen haben:

  1. Wenn der Typ von Expression ein Subtyp von Iterable dann ist die Übersetzung wie folgt:

    List<String> someList = new ArrayList<String>();
    someList.add("Apple");
    someList.add("Ball");
    for (String item : someList) {
        System.out.println(item);
    }
    
    // IS TRANSLATED TO:
    
    for(Iterator<String> stringIterator = someList.iterator(); stringIterator.hasNext(); ) {
        String item = stringIterator.next();
        System.out.println(item);
    }
  2. Wenn die Expression notwendigerweise einen Array-Typ hat T[] dann:

    String[] someArray = new String[2];
    someArray[0] = "Apple";
    someArray[1] = "Ball";
    
    for(String item2 : someArray) {
        System.out.println(item2);
    }
    
    // IS TRANSLATED TO:
    for (int i = 0; i < someArray.length; i++) {
        String item2 = someArray[i];
        System.out.println(item2);
    }

Java 8 hat Streams eingeführt, die im Allgemeinen besser mit absteigenden Datensätzen funktionieren. Wir können sie als verwenden:

someList.stream().forEach(System.out::println);
Arrays.stream(someArray).forEach(System.out::println);

4 Stimmen

Die wichtigste und genaueste Antwort. Enchansed for hat in der Tat zwei Übersetzungen.

2 Stimmen

Dem stimme ich überhaupt nicht zu: Java 8 hat Streams eingeführt, die im Allgemeinen besser funktionieren. Streams sind nur dann wirklich realisierbar, wenn man mit einem ausreichend großen Datensatz arbeitet. Auch .stream().forEach() kann ersetzt werden durch .forEach()

0 Stimmen

Ich bin nicht so denken über .forEach(), weil die Laufzeiten von forEeach mehr als für Schleife, so dass forEarch don't beste Lösungen

28voto

EfForEffort Punkte 55686

Die Antwort von nsayer deutet es an, aber es ist erwähnenswert, dass die for(..)-Syntax des OPs funktioniert, wenn "someList" ein alles die java.lang.Iterable implementiert - es muss nicht unbedingt eine Liste oder eine Sammlung aus java.util sein. Sogar Ihre eigenen Typen können daher mit dieser Syntax verwendet werden.

2 Stimmen

Fd ist richtig - der interne Code, wenn die rechte Seite des for(:) Idioms einen int und array.length verwendet, anstatt einen Iterator zu holen. forums.sun.com/thread.jspa?messageID=2743233

26voto

PrivateName Punkte 343

Die Syntax einer foreach-Schleife lautet:

for (type obj:array) {...}

Beispiel:

String[] s = {"Java", "Coffe", "Is", "Cool"};
for (String str:s /*s is the array*/) {
    System.out.println(str);
}

出力します。

Java
Coffe
Is
Cool

ACHTUNG: Sie können mit der foreach-Schleife auf Array-Elemente zugreifen, aber Sie können sie NICHT initialisieren. Verwenden Sie die ursprüngliche for Schleife dafür.

WARNUNG: Sie müssen den Typ des Arrays mit dem anderen Objekt abgleichen.

for (double b:s) // Invalid-double is not String

Wenn Sie Elemente bearbeiten wollen, verwenden Sie das Original for Schleife wie diese:

for (int i = 0; i < s.length-1 /*-1 because of the 0 index */; i++) {
    if (i==1) //1 because once again I say the 0 index
        s[i]="2 is cool";
    else
        s[i] = "hello";
}

Wenn wir nun s in die Konsole eingeben, erhalten wir:

hello
2 is cool
hello
hello

24voto

Ryan Delucchi Punkte 7568

Das Java-Schleifenkonstrukt "for-each" ermöglicht die Iteration über zwei Arten von Objekten:

  • T[] (Arrays beliebigen Typs)
  • java.lang.Iterable<T>

Le site Iterable<T> Schnittstelle hat nur eine Methode: Iterator<T> iterator() . Dies funktioniert bei Objekten des Typs Collection<T> weil die Collection<T> Schnittstelle erweitert Iterable<T> .

23voto

Jrovalle Punkte 311

In Java 8 können Sie diese Funktionen verwenden:

List<String> messages = Arrays.asList("First", "Second", "Third");

void forTest(){
    messages.forEach(System.out::println);
}

Ausgabe

First
Second
Third

14 Stimmen

Diese willkürliche Information beantwortet die Frage nicht einmal im Entferntesten

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X