• Skip to primary navigation
  • Skip to content

Mauda

IT, Java and Music

Graduação   SCJP   Mestrado
  • Apresentação
  • Certificação Java
  • JPA
    • Exceptions
  • JSF
  • Versionamento
  • Contato

Java 8 – Método removeIf() da interface java.util.Collection – #MelhoreSeuCodigo

April 1, 2019 by Mauda Leave a Comment

Conteúdo do Post:
  1. Exemplo e contextualização
  2. Antes do Java 8 – Utilizando o forEach
  3. Java 8 – Utilizando o método removeIf da interface java.util.Collection
  4. Predicate – O que é? Para que serve? O que comem? Onde vivem?
  5. Método removeIf
  6. finnaly{

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.

Figura 01 – Classes Album e Artista – Representação UML

 

Agora suponha que temos uma classe Ouvinte que possui uma lista de Artistas favoritos, representado pelo seguinte código Java:

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:

Java
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:

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

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

Java
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:

Java
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:.

Java
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!

Filed Under: Collection, Java, JDK 8 Tagged With: interface funcional, Java, Java 8, predicate, removeIf

About Mauda

Mestre em Informática, Analista de Sistemas, Professor, SCJP e Baterista. Desde 2002 trabalhando no mundo Java e ensinando pessoas sobre desenvolvimento de sistemas. Mais informações

Reader Interactions

Leave a Reply Cancel reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.

Advertisements

Copyright © 2025 · Genesis Framework · WordPress · Log in