AFF Education Construa seu Futuro

Aula 47a - Loop for-each: Conceito e Índices

O que é o Loop for-each?

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..."

Sintaxe e Estrutura

Loop for tradicional:

for (int i = 0; i < array.length; i++) {
    // Acessa elemento usando índice: array[i]
}

Loop for-each:

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.

Como os Elementos de um Vetor São Organizados

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:

int[] notas = { 7, 5, 6, 8, 9 };

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!

Como o Loop Acumula Valores: Soma de Notas Passo a Passo

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:

soma = soma + nota

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.

média = soma ÷ quantidade  →  35 ÷ 5 = 7.0

Veja o mesmo processo implementado das duas formas — primeiro com for tradicional, depois com for-each:

Com for tradicional:

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

Com for-each:

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:

Exemplo 1: Loop for-each com Array de Strings

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"

Usando for-each:

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

Comparação com for tradicional:

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!

Exemplo 2: Loop for-each com Array de Inteiros

Calculando soma usando for-each:

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

Comparação com for tradicional:

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

Quando NÃO usar for-each?

Situação 1: Quando você precisa do índice

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!

Situação 2: Quando você quer modificar os elementos do array

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.

Exemplo 3: Encontrando o Maior Valor

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 012345
Elemento 452378129034
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

Usando for-each:

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

Usando for tradicional:

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!

Exercícios — Parte A

Teste seus conhecimentos sobre conceito, índices e acumulação com for-each:

1. Qual é a sintaxe correta do loop for-each em Java?

2. Dado o vetor int[] notas = {7, 5, 6, 8, 9}, qual o valor de notas[3]?

3. O que o seguinte código imprime?

int[] nums = {10, 20, 30};
int soma = 0;
for (int n : nums) {
    soma += n;
}
System.out.println(soma);

4. Qual a principal vantagem do for-each em relação ao for tradicional?

5. Dado int[] notas = {7, 5, 6, 8, 9} e soma = 0, qual é o valor de soma após o Loop 3 (terceira iteração)?

6. O que acontece quando tentamos modificar o array com for-each assim: for (int n : nums) { n = n * 2; }?

7. Qual loop é mais apropriado para exibir posições como "Posição 0: Maçã"?

Exercícios de Aplicação AFF Education

Reforce o conteúdo desta aula com mais dois exercícios práticos:

1. No laço for-each for (int x : numeros), a variável x recebe:

2. Quando o for tradicional (com índice i) é preferível ao for-each?