O loop for-each (também conhecido como enhanced for loop ou for melhorado) é uma forma simplificada de percorrer arrays e coleções em Java.
Foi introduzido no Java 5 para tornar o código mais limpo e legível quando você precisa acessar todos os elementos de um array, mas não precisa saber o índice de cada elemento.
for (TipoDoElemento elemento : nomeDoArray) { ... }
Leia-se: "Para cada elemento do tipo TipoDoElemento dentro do nomeDoArray, execute..."
for (int i = 0; i < array.length; i++) {
// Acessa elemento usando índice: array[i]
}
for (TipoDoElemento elemento : array) {
// Acessa elemento diretamente: elemento
}
Dica: Use for-each quando precisar apenas percorrer e ler os elementos. Use for tradicional quando precisar do índice ou modificar o array.
Antes de entender o for-each, é fundamental saber como os elementos de um vetor estão dispostos na memória. Cada elemento ocupa uma posição numerada, chamada de índice, que sempre começa em zero.
Considere o vetor de notas abaixo:
Veja como os índices, os elementos e as formas de acesso se relacionam:
| Linha | Posição 0 | Posição 1 | Posição 2 | Posição 3 | Posição 4 |
|---|---|---|---|---|---|
| Índice | 0 | 1 | 2 | 3 | 4 |
| Elemento (valor) | 7 | 5 | 6 | 8 | 9 |
| Acesso com for tradicional | notas[0] |
notas[1] |
notas[2] |
notas[3] |
notas[4] |
| Acesso com for-each | nota = 7 |
nota = 5 |
nota = 6 |
nota = 8 |
nota = 9 |
Observe a diferença: No for tradicional, você usa notas[i] — ou seja, precisa saber o índice i para acessar o elemento. No for-each, a variável nota já recebe automaticamente o valor de cada posição, uma por vez, sem precisar do índice.
Atenção ao índice zero: O primeiro elemento do vetor tem sempre índice 0, o segundo tem índice 1, e assim por diante. Um vetor com 5 elementos vai do índice 0 ao índice 4. Acessar notas[5] causaria um erro, pois essa posição não existe!
Uma das aplicações mais comuns do loop é acumular valores — por exemplo, somar todos os elementos de um vetor para depois calcular uma média. Para entender como isso funciona por dentro, vamos acompanhar cada etapa do loop ao somar as notas { 7, 5, 6, 8, 9 }.
Fórmula geral de acumulação:
A cada volta do loop, o valor atual de soma recebe ele mesmo mais o próximo elemento nota do vetor. Assim, a soma cresce progressivamente a cada iteração.
| Iteração | Elemento atual (nota) | soma (antes) | Operação | soma (nova) |
|---|---|---|---|---|
| Loop 1 | 7 (notas[0]) | 0 | 0 + 7 | 7 |
| Loop 2 | 5 (notas[1]) | 7 | 7 + 5 | 12 |
| Loop 3 | 6 (notas[2]) | 12 | 12 + 6 | 18 |
| Loop 4 | 8 (notas[3]) | 18 | 18 + 8 | 26 |
| Loop 5 | 9 (notas[4]) | 26 | 26 + 9 | 35 |
⬆️ Após o Loop 5, todos os elementos do vetor foram percorridos. O loop encerra e o programa segue para a próxima instrução: calcular a média dividindo a soma pelo número de elementos.
Veja o mesmo processo implementado das duas formas — primeiro com for tradicional, depois com for-each:
public class MediaNotasTradicional {
public static void main(String[] args) {
int[] notas = {7, 5, 6, 8, 9};
int soma = 0;
// Loop: acessa cada elemento pelo índice i
for (int i = 0; i < notas.length; i++) {
soma = soma + notas[i];
System.out.println("Loop " + (i + 1) + ": notas[" + i + "] = "
+ notas[i] + ", soma = " + soma);
}
// Após o loop: calcula a média
double media = (double) soma / notas.length;
System.out.println("Soma total: " + soma);
System.out.println("Média das notas: " + media);
}
}
Loop 1: notas[0] = 7, soma = 7
Loop 2: notas[1] = 5, soma = 12
Loop 3: notas[2] = 6, soma = 18
Loop 4: notas[3] = 8, soma = 26
Loop 5: notas[4] = 9, soma = 35
Soma total: 35
Média das notas: 7.0
public class MediaNotasForEach {
public static void main(String[] args) {
int[] notas = {7, 5, 6, 8, 9};
int soma = 0;
int iteracao = 1;
// For-each: a variável "nota" recebe automaticamente cada elemento
for (int nota : notas) {
soma = soma + nota;
System.out.println("Loop " + iteracao + ": nota = "
+ nota + ", soma = " + soma);
iteracao++;
}
// Após o loop: calcula a média
double media = (double) soma / notas.length;
System.out.println("Soma total: " + soma);
System.out.println("Média das notas: " + media);
}
}
Loop 1: nota = 7, soma = 7
Loop 2: nota = 5, soma = 12
Loop 3: nota = 6, soma = 18
Loop 4: nota = 8, soma = 26
Loop 5: nota = 9, soma = 35
Soma total: 35
Média das notas: 7.0
✅ Boas práticas observadas neste exemplo:
soma é sempre inicializada com zero antes do loop.notas.length para determinar automaticamente o número de elementos, sem erros caso o vetor mude de tamanho.(double) garante que a divisão produza um resultado decimal e não inteiro.Primeiro, veja a tabela de índices deste vetor de nomes:
| Linha | Posição 0 | Posição 1 | Posição 2 | Posição 3 |
|---|---|---|---|---|
| Índice | 0 | 1 | 2 | 3 |
| Elemento (valor) | Ana | Bruno | Carlos | Diana |
| Acesso com for tradicional | nomes[0] |
nomes[1] |
nomes[2] |
nomes[3] |
| Acesso com for-each | nome = "Ana" |
nome = "Bruno" |
nome = "Carlos" |
nome = "Diana" |
public class ForEachStrings {
public static void main(String[] args) {
String[] nomes = {"Ana", "Bruno", "Carlos", "Diana"};
// For-each: "nome" recebe cada elemento automaticamente
for (String nome : nomes) {
System.out.println("Nome: " + nome);
}
}
}
Nome: Ana
Nome: Bruno
Nome: Carlos
Nome: Diana
public class ForTradicionalStrings {
public static void main(String[] args) {
String[] nomes = {"Ana", "Bruno", "Carlos", "Diana"};
// For tradicional: acessa cada elemento pelo índice i
for (int i = 0; i < nomes.length; i++) {
System.out.println("Nome: " + nomes[i]);
}
}
}
Nome: Ana
Nome: Bruno
Nome: Carlos
Nome: Diana
Observação: O resultado é o mesmo, mas o for-each é mais simples e legível!
public class ForEachInteiros {
public static void main(String[] args) {
int[] notas = {7, 8, 9, 6, 10};
int soma = 0;
// Calculando a soma usando for-each
for (int nota : notas) {
soma += nota;
System.out.println("Nota: " + nota);
}
System.out.println("Soma total: " + soma);
System.out.println("Média: " + (soma / notas.length));
}
}
Nota: 7
Nota: 8
Nota: 9
Nota: 6
Nota: 10
Soma total: 40
Média: 8
public class ForTradicionalInteiros {
public static void main(String[] args) {
int[] notas = {7, 8, 9, 6, 10};
int soma = 0;
// Calculando a soma usando for tradicional
for (int i = 0; i < notas.length; i++) {
soma += notas[i];
System.out.println("Nota: " + notas[i]);
}
System.out.println("Soma total: " + soma);
System.out.println("Média: " + (soma / notas.length));
}
}
Nota: 7
Nota: 8
Nota: 9
Nota: 6
Nota: 10
Soma total: 40
Média: 8
public class PrecisaIndice {
public static void main(String[] args) {
String[] frutas = {"Maçã", "Banana", "Laranja"};
// For tradicional mostra posição
for (int i = 0; i < frutas.length; i++) {
System.out.println("Posição " + i + ": " + frutas[i]);
}
}
}
Posição 0: Maçã
Posição 1: Banana
Posição 2: Laranja
Atenção: O for-each não fornece acesso ao índice do elemento!
public class ModificarArray {
public static void main(String[] args) {
int[] numeros = {1, 2, 3, 4, 5};
// For tradicional pode modificar o array
for (int i = 0; i < numeros.length; i++) {
numeros[i] = numeros[i] * 2; // Multiplica por 2
}
// Exibindo os valores modificados
for (int numero : numeros) {
System.out.println(numero);
}
}
}
2
4
6
8
10
❌ Errado com for-each:
for (int numero : numeros) {
numero = numero * 2; // Isso NÃO modifica o array original!
}
O for-each trabalha com uma cópia do elemento, não com o elemento original do array.
Veja a tabela de índices antes de analisar o código:
| Linha | Pos. 0 | Pos. 1 | Pos. 2 | Pos. 3 | Pos. 4 | Pos. 5 |
|---|---|---|---|---|---|---|
| Índice | 0 | 1 | 2 | 3 | 4 | 5 |
| Elemento | 45 | 23 | 78 | 12 | 90 | 34 |
| For tradicional | valores[0] |
valores[1] |
valores[2] |
valores[3] |
valores[4] |
valores[5] |
| For-each | valor=45 |
valor=23 |
valor=78 |
valor=12 |
valor=90 |
valor=34 |
public class MaiorValorForEach {
public static void main(String[] args) {
int[] valores = {45, 23, 78, 12, 90, 34};
int maior = valores[0]; // Começa com o primeiro valor
for (int valor : valores) {
if (valor > maior) {
maior = valor;
}
}
System.out.println("O maior valor é: " + maior);
}
}
O maior valor é: 90
public class MaiorValorForTradicional {
public static void main(String[] args) {
int[] valores = {45, 23, 78, 12, 90, 34};
int maior = valores[0];
for (int i = 1; i < valores.length; i++) {
if (valores[i] > maior) {
maior = valores[i];
}
}
System.out.println("O maior valor é: " + maior);
}
}
O maior valor é: 90
✅ Boa prática: Para encontrar valores sem precisar do índice, o for-each é mais elegante!
Teste seus conhecimentos sobre conceito, índices e acumulação com for-each:
Reforce o conteúdo desta aula com mais dois exercícios práticos: