Jak działa pętla Java 'for each'?

Zastanów się:

List<String> someList = new ArrayList<String>();
// add "monkey", "donkey", "skeleton key" to someList
for (String item : someList) {
    System.out.println(item);
}

Jak wyglądałaby równoważna pętla for bez użycia składni for each?

Rozwiązanie
for (Iterator i = someIterable.iterator(); i.hasNext();) {
    String item = i.next();
    System.out.println(item);
}

Zauważ, że jeśli musisz użyć i.remove(); w swojej pętli, lub uzyskać dostęp do rzeczywistego iteratora w jakiś sposób, nie możesz użyć idiomu for ( : ), ponieważ rzeczywisty iterator jest jedynie wnioskowany.

Jak zauważył Denis Bueno, ten kod działa dla każdego obiektu, który implementuje interfejs Iterable.

Również, jeśli prawa strona idiomu for (:) jest array a nie obiektem Iterable, wewnętrzny kod używa licznika indeksu int i sprawdza względem array.length zamiast tego. Zobacz Specyfikacja języka Java.

Komentarze (4)

Pętla for-each w Javie wykorzystuje bazowy mechanizm iteratorów. Jest więc identyczna jak poniższa:

Iterator iterator = someList.iterator();

while (iterator.hasNext()) {
  String item = iterator.next();
  System.out.println(item);
}
Komentarze (0)

Oto równoważne wyrażenie.

for(Iterator sit = someList.iterator(); sit.hasNext(); ) {
    System.out.println(sit.next());
}
Komentarze (0)