Olá Pessoal, tudo bom?
Começarei a escrever alguns artigos relacionados a alguns métodos que são úteis para o dia a dia. Hoje vamos falar sobre o método forEach() da interface java.lang.Iterable. Veremos como melhorar o código com um exemplo. Veja na continuação:
Exemplo e contextualização
Vamos supor o seguinte exemplo. Suponha que em nosso projeto temos duas classes Album e Artista, conforme Figura 01. Album possui um atributo String titulo e Artista possui um atributo String nome. Além disso, existe uma associação UM para MUITOS entre elas.
Agora suponha que temos uma classe Ouvinte que possui uma lista de Artistas favoritos, representado pelo seguinte código Java:
1 2 3 4 5 6 7 |
import java.util.List; public Class Ouvinte { private List<Artista> favoritos; //Outros atributos e códigos não relevantes para o momento } |
Agora temos a seguinte funcionalidade que deve ser construída:
O Ouvinte pode listar todos os nomes dos artistas que ele possui como favoritos!
Primeiramente vamos definir uma assinatura para o método que de acordo com a metodologia DDD (Design Domain Driven) estará dentro da própria classe Ouvinte:
1 2 3 |
public void listarFavoritos(){ //Codígo para listar } |
Vamos ver como ficaria um código na versão antes do Java 8 e depois um código na versão Java 8.
Antes do Java 8 – Utilizando o forEach
Para esse exemplo será utilizado um forEach com um método que realiza a impressão do nome do artista:
1 2 3 4 5 |
public void listarFavoritos(){ for (Artista artista : this.favoritos) { System.out.println(artista.getNome()); } } |
A titulo de comentário a impressão está sendo feita no console a fim de não complicar o exemplo.
Java 8 – Utilizando o método forEach da interface java.lang.Iterable
O Java 8 trouxe o poder das lambdas expressions e a linguagem funcional. Isso tornou o código mais complexo de ser lido em um primeiro momento, mas que fica bem menos verboso e mais rápido. Assim irei primeiro mostrar o código pronto e depois uma explicação sobre como cheguei a esse ponto.
1 2 3 |
public void desfavoritarArtista(String nomeArtista) { this.favoritos.forEach(artista -> System.out.println(artista.getNome())); } |
O forEach sumiu!!! Mas vamos ver isso com mais detalhes.
Consumer – O que é? Para que serve? O que comem? Onde vivem?
Consumer é um dos quatro tipos básicos de interfaces funcionais que são utilizadas pelos métodos funcionais. Ela possui um retorno void e recebe um determinado tipo T para realizar algum “consumo”.
Para criar um consumer é muito parecido com o código que produzimos no exemplo anterior. Ao imprimir o nome do artista, nós estamos aplicando um consumer. Então o primeiro ponto aqui para entender como construir um consumir é pensar na impressão original que fizemos.
1 |
System.out.println(artista.getNome()); |
Essa impressão se transformará em um consumer com os seguintes passos:
- Pegue o nome da variável do forEach, no caso aqui artista.
- Adicione uma “Flecha” -> (operador para expressões lambdas)
- Coloque a impressão que foi construída anteriormente.
Dessa forma a nossa impressão do exemplo se transformará em:
1 |
artista -> System.out.println(artista.getNome()) |
Como não temos mais a declaração do forEach é necessário criar uma nova variável “artista”, pois o forEach realizada essa declaração. Um detalhe importante aqui é que o nome da variável deve ser diferente que qualquer outra declarada anteriormente no método.
Guarde esse consumer que criamos, pois agora utilizaremos o método forEach.
Método forEach
Chegou a hora de utilizar o método forEach. Agora execute os seguintes passos.
- Pegue a List em questão. No caso do exemplo a favoritos.
- A partir dessa lista chame o métodoforEach()
- Como parâmetro desse método adicione o consumer criado na parte anterior.
Dessa forma, seu resultado final será o seguinte código:.
1 |
this.favoritos.forEach(artista -> System.out.println(artista.getNome())); |
finnaly{
Agora aplique esse código com esses passos que rapidamente você já terá aprendido a construir consumers! Não tenha medo de antes fazer o forEach para depois utilizar o método forEach, lembre-se você está aprendendo isso é o mais importante!
Duvidas ou sugestões? Deixe seu feedback! Isso ajuda a saber a sua opinião sobre os artigos e melhorá-los para o futuro! Isso é muito importante!
Até um próximo post!
Leave a Reply