Enhanced For e so para arrays e collections?

Pessoal, continuo meio intrigado com o for each :frowning:
Ele foi criado para ser usado apenas com arrays e collections ou alguem utiliza ele dessa maneira? Como ele pode percorrer todas as posicoes de uma array sem eu dar seus devidos indices e sem chamar nenhum metodo? :shock:

Ele é para arrays e para coisas que implementem a interface Iterable. A interface Collection herda de Iterable, logo funciona para Collections.

Na verdade isso é um “syntatic sugar”, o compilador gera sozinho o código que faz a iteração. Desta forma o programador não precisa se preocupar de como iterar e sim o compilador se preocupa com isso.

Praticamente quando voce compila isso

List<Object> s = //sua lista
for(Object obj : s){
System.out.printlln(obj.toString());
}

O compilador faz isso:

List<Object> s = //sua lista
Iterator<Object> iterator = s.iterator();
while(iterator.hasNext()){
Object obj = iterator.next();
System.out.printlln(obj.toString());
}

Não lembro direito se é assim… mas é basicamente isso.

Obrigado victorwss e Mark_Ameba, agora consegui intender! :wink:

[quote=Mark_Ameba]Praticamente quando voce compila isso

List<Object> s = //sua lista
for(Object obj : s){
System.out.printlln(obj.toString());
}

O compilador faz isso:

List<Object> s = //sua lista
Iterator<Object> iterator = s.iterator();
while(iterator.hasNext()){
Object obj = iterator.next();
System.out.printlln(obj.toString());
}

Não lembro direito se é assim… mas é basicamente isso.[/quote]

Praticamente isso mesmo.

O único problema de usar o for melhorado é que ele não te dá o iterator pra você, significando que não dá pra remover itens da coleção enquanto a iteramos, entre outras coisas.

Já há algumas discussões sobre arrumar isso, uma extensão p/ esse for:

for (String s : list : it)

É capaz de vermos isso no futuro.