Como funciona o Java 'para cada' loop?

Considere:

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

Como seria o laço equivalente "para" sem utilizar a sintaxe para cada?

Solução
for (Iterator i = someIterable.iterator(); i.hasNext();) {
    String item = i.next();
    System.out.println(item);
}

Note que se você precisa utilizar i.remove(); em seu loop, ou acessar o iterador real de alguma forma, você não pode utilizar a expressão for ( : ), já que o iterador real é meramente inferido.

Como foi observado por Denis Bueno, este código funciona para qualquer objeto que implemente a interface iterável.

Além disso, se o lado direito do for (:)idioma é um objeto array em vez de um objeto Iterable, o código interno utiliza um contador de índice int e verifica contra array.length em vez disso. Veja a Especificação da Linguagem Java.

Comentários (4)

O laço para cada em Java usa o mecanismo de iterador subjacente. Portanto, é idêntico ao seguinte:

Iterator iterator = someList.iterator();

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

Aqui está uma expressão equivalente.

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