Olá Pessoal, tudo bom?
Hoje vamos falar sobre o método removeIf() 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 remover um artista favorito a qualquer momento da sua lista a partir de um toque no ícone de 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 desfavoritarArtista(String nomeArtista){ //Codígo para desfavoritar } |
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 if interno verificando o nome do artista. Caso sejam iguais, o artista será removido da lista de favoritos:
1 2 3 4 5 6 7 8 9 10 11 |
public void desfavoritarArtista(String nomeArtista){ if(nomeArtista == null || nomeArtista.trim().isEmpty()) { return; } for (Artista artista : this.favoritos) { if (artista.getNome().equals(nomeArtista)) { this.favoritos.remove(artista); } } } |
A titulo de comentário apenas que o parâmetro nomeArtista é verificado senão está nulo ou vazio, o qual retorna sem realizar ação nenhuma.
Assim o forEach varre a lista dos artistas favoritos, buscando algum ou alguns cujo nome seja igual ao artista passado.
Java 8 – Utilizando o método removeIf da interface java.util.Collection
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 4 5 6 7 |
public void desfavoritarArtista(String nomeArtista) { if (nomeArtista == null || nomeArtista.trim().isEmpty()) { return; } this.favoritos.removeIf(artista -> artista.getNome().equals(nomeArtista)); } |
A parte da validação do nome do artista permaneceu a mesma. O que mudou ali foi que o forEach sumiu. Mas vamos ver isso com mais detalhes.
Predicate – O que é? Para que serve? O que comem? Onde vivem?
Predicate é um dos quatro tipos básicos de interfaces funcionais que são utilizadas pelos métodos funcionais. Ela possui um retorno de boolean e recebe um determinado tipo T e realizada uma validação que retorna boolean.
Na verdade aquele If que fazíamos no código anterior é exatamente isso. Ao verificar se o nome do artista é igual a String passada, nós estamos aplicando um predicate. Então o primeiro ponto aqui para entender como construir um predicate é pensar no IF original que fizemos.
1 |
if (artista.getNome().equals(nomeArtista)) { |
Esse IF se transformará em um predicate 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 validação que foi construída anteriormente.
Dessa forma o nosso IF do exemplo se transformará em:
1 |
artista -> artista.getNome().equals(nomeArtista) |
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 predicate que criamos, pois agora utilizaremos o método removeIf.
Método removeIf
Chegou a hora de utilizar o método removeIf. Agora execute os seguintes passos.
- Pegue a Collection, List em questão. No caso do exemplo a favoritos.
- A partir dessa lista chame o método removeIf()
- Como parâmetro desse método adicione o predicate criado na parte anterior.
Dessa forma, seu resultado final será o seguinte código:.
1 |
this.favoritos.removeIf(artista -> artista.getNome().equals(nomeArtista)); |
finnaly{
Agora aplique esse código com esses passos que rapidamente você já terá aprendido a construir predicates! Não tenha medo de antes fazer o forEach para depois utilizar o método removeIf, 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