Article image
Giselle Ferreira
Giselle Ferreira09/02/2024 16:39
Compartilhe

Funções Java: Decifrando O forEach()

    O forEach() é uma função Java introduzida no Java 8, como parte da API de Streams e da programação funcional. Ele está presente na interface Iterable. Sendo, portanto, comumente utilizado em coleções do tipo List, Set, Map, Arrays, etc.

    Sua finalidade é executar uma ação específica para cada elemento da coleção (ou sequência de elementos) sem a necessidade de usar explicitamente um Loop.

    Segundo o Javadoc, ele "realiza uma ação em cada elemento, em ordem, até que todos sejam processados, ou até que uma exceção seja lançada".

    Sintaxe

    
    arrayOuCollection.forEach(elemento -> {
    // Ação 
     })
    
    

    Para ficar mais claro, ele pode ser lido da desta forma na linguagem natural:

    "Para cada elemento dentro no arrayOuCollection, execute a seguinte ação" .

    Note que, em um for-loop (enhanced) tradicional, ele seria escrito da seguinte forma:

    for (Tipo elemento : arrayOuCollection) {
    // Ação
    }
    

    E também pode ser representado graficamente conforme diagrama abaixo:

    image

    Aplicações

    A forma de utilização do forEach() depende do contexto. Trago aqui algumas das variações de utilização e suas respectivas sintaxes.

    → Lista:

    
    List<String> lista = Arrays.asList("A", "B", "C");
    
    

    Lamba Expression:

    
    lista.forEach(elemento -> System.out.println(elemento));
    
    

    ▸ Referência de método:

    
    lista.forEach(System.out::println);
    
    

    ▸ Streams:

    
    lista.stream().forEach(elemento -> System.out.println(elemento));
    
    

    Saída:

    A
    B
    C
    

    ▸ Filter:

    lista.stream().filter( element -> element == "B").forEach(System.out::println);
    

    Saída:

    B
    

    → Set:

    Set<String> letras = new HashSet<>(Arrays.asList("A", "B", "C"));
    
    letras.forEach(System.out::println);
    

    Saída:

    A
    B
    C
    

    → Map:

    
    Map<Integer, String> mapa = new HashMap<>();
    mapa.put(1, "A");
    mapa.put(2, "B");
    mapa.put(3, "C");
    
    
    mapa.forEach((chave, valor) -> System.out.println(chave + ": " + valor));
    
    

    Saída:

    
    1: A
    2: B
    3: C
    
    

    Quando Utilizar o forEach()?

    A partir do que vimos até agora, podemos inferir algumas características do método que são importantes salientar, e fazem a diferença na definição do uso do mesmo em um código. Tendo isso em mente, vejamos quando podemos ou devemos utilizar o forEach():

    → Interações simples. Ele substitui o loop tradicional, funcionando, no entanto, da mesma forma;

    → Expressões Lambda ou Referência de Método, que deixam o código mais conciso;

    → Operações em Collections;

    → Operações em paralelo, trabalhando com Streams;

    → Para evitar erros com índices, e quando não há necessidade do uso destes.

    Quando não Utilizar o forEach()?

    Embora ele seja uma versão simplificada em relação ao For tradicional, existem algumas situações em que ele não pode ser utilizado, e a maioria delas, consequência da não utilização de índices em sua sintaxe. São elas:

    Adicionar, modificar ou remover um elemento;

    Recuperar um conjunto de valores;

    Acessar um índice de um elemento;

    Quando há necessidade de mais controle sobre a iteração;

    Lógicas mais complexas, com diversas condições e múltiplas coleções em paralelo.

    Para estas situações, a melhor opção é utilizar o For loop tradicional.

    Vantagens x Desvantagens

    Com as características trazidas até o momento, já podemos ter uma ideia de quais são as vantagens e desvantagens de usar o forEach(). Vejamos quais são:

    ✅ Vantagens

    1 - Legibilidade;

    2 - Evita erros com índices;

    3 - A própria função se encarrega de fazer o loop sobre os elementos.

    4 - É de fácil adoção;

    5 - Permite o uso de expressões lambas e referências de métodos;

    6 - Pode ser usado com Streams para realizar operações em paralelo em coleções grandes.

    Desvantagens

    1 - É menos flexível do que o For tradicional, já que não pode ser usado para iterar em algumas situações;

    2 - Não fornece acesso ao índice ou a uma variável contadora, o que pode ser útil em diversas situações;

    3 - Falta de controle sobre as iterações;

    4 - Não permite a propagação de exceções checadas (checked exceptions). Se uma exceção for lançada, ela deve ser tratada dentro do bloco forEach, não podendo ser propagadas pelo método chamador

    Conclusão

    No geral, o forEach() simplifica a iteração em Java, tornando o código mais conciso e legível, e elimina a necessidade de lidar explicitamente com índices. Isso reduz a probabilidade de erros, mas também impossibilita o uso do mesmo em algumas situações.

    Sendo assim, é crucial examinar em quais circunstâncias ele pode ser empregado e se adequará de maneira mais eficaz.

    Mais informações podem ser encontradas em:

    Compartilhe
    Comentários (5)
    Miquéias Silva
    Miquéias Silva - 20/02/2024 14:24

    O seu ficou bom, mas o meu ficou melhor: https://web.dio.me/articles/explorando-o-map-em-java-como-utilizar-esta-funcao-poderosa-para-manipular-colecoes-de-dados


    Deveria mudar este método de escolha dos ganhadores, deveria ser por votação, onde os avaliadores escolheria os 10 melhores com critérios claros e objetivos e colocaria para votação aqui.

    Regilene Silva
    Regilene Silva - 09/02/2024 17:05

    Ótimo artigo, Giselle! Boa sorte, se estiver participando da competição de artigos.

    Giselle Ferreira
    Giselle Ferreira - 10/02/2024 13:27

    Humm, ótima contribuição Luis! Obrigada pelo comentário.

    Vou fazer uns testes com o filter por aqui, como você disse.

    E eu já me peguei querendo usar o forEach como map eheheheh

    Luis Zancanela
    Luis Zancanela - 09/02/2024 18:55

    Artigo legal, o forEach pode até não dar controle na iteração, mas se combinar com filter antes dá para ao menos fazer a iteração somente no que precisa. Outra coisa foi uma dúvida que me atormentou no começo, o forEach parece muito o map no jeito de usar, mas tem diferenças, como dito no artigo, o forEach serve para executar operações e não tem retorno, já o map é usado normalmente para transformar e por isso o map tem retorno, o negócio é praticar e sentir as diferenças na execução

    Giselle Ferreira
    Giselle Ferreira - 09/02/2024 17:18

    Obrigada pelo feedback, Regilene!! 🫶🏻