Usando Filter do Java 8 em Map

O objetivo do post é mostrar como usar o filter do Java 8 para filtrar dados de um objeto do tipo Map

Wolmir Cezer Garbin por Wolmir Cezer Garbin - - Java - TUTORIAL

Última atualização em: | 25502 Visualizações

A adição dos lambdas ao Java 8 foi sem duvidas uma revolução no desenvolvimento.

Veja alguns exemplos. Considere que temos um Map e precisamos realizar alguns filtros sobre os valores e as chaves. Veja:

Map<Integer, String> hosts = new HashMap<>();
hosts.put(1, "garbosoftware.com.br");
hosts.put(2, "receitasdecodigo.com.br");
hosts.put(3, "anuncieon.com");
hosts.put(4, "patobranco.anuncieon.com");

Filtrando pela valor do Map

Antes do Java 8, para filtrar um item tinhamos que fazer da seguinte forma:

// antes do Java 8
for (Map.Entry<Integer, String> entry : hosts.entrySet()) {
    if ("anuncieon.com".equals(entry.getValue())) {
        System.out.println( "Antes do Java 8: " + entry.getValue() );
    }
}

Usando lambdas podemos escrever assim:

// após o Java 8
hosts.entrySet()
        .stream()
        .filter(map -> "anuncieon.com".equals(map.getValue()))
        .forEach( map -> System.out.println( "Após Java 8 : " + map.getValue() ) );

Ou caso queira extrair o valor para uma variável, pode fazer assim:

// extraindo para uma variável
Optional<String> result = hosts.entrySet()
    .stream()
    .filter(map -> "anuncieon.com".equals(map.getValue()))
    .map(map -> map.getValue())
    .findFirst();

if ( result.isPresent() ) {
    System.out.println("Após Java 8 : " + result.get());
}

Para cada exemplo, obtemos os mesmos resultados:

Antes do Java 8: anuncieon.com
Após Java 8 : anuncieon.com
Após Java 8 : anuncieon.com

Filtrando pela chave do Map

Para este exemplo, será listado todos os itens cujo código seja menor ou igual a 3.

Antes do Java 8 temos:

// antes do Java 8
for (Map.Entry<Integer, String> entry : hosts.entrySet()) {
    if (entry.getKey() <= 3 ) {
        System.out.println( "Antes do Java 8: " + entry.getValue() );
    }
}

Realizando o mesmo filtro usando lambdas, temos:

// após o Java 8
hosts.entrySet()
        .stream()
        .filter(map -> map.getKey() <= 3 )
        .forEach( map -> System.out.println( "Após Java 8 : " + map.getValue() ) );

Ou ainda podemos extrair os valores para uma lista de String permitindo fazer outras operações sobre o resultado, veja:

// extraindo para uma lista
List<String> collect = hosts.entrySet()
        .stream()
        .filter(map -> map.getKey() <= 3)
        .map(map -> "Após Java 8 : " + map.getValue())
        .collect(Collectors.toList());

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

Ambos os exemplos retornaram o mesmo valor:

// Antes do Java 8
Antes do Java 8: garbosoftware.com.br
Antes do Java 8: receitasdecodigo.com.br
Antes do Java 8: anuncieon.com

// após o Java 8
Após Java 8 : garbosoftware.com.br
Após Java 8 : receitasdecodigo.com.br
Após Java 8 : anuncieon.com

// extraindo para uma lista
Após Java 8 : garbosoftware.com.br
Após Java 8 : receitasdecodigo.com.br
Após Java 8 : anuncieon.com

Segue o código completo deste exemplo:

import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.stream.Collectors;

public class MapFilterSample {

    public static void main(String[] args) {

        Map<Integer, String> hosts = new HashMap<>();
        hosts.put(1, "garbosoftware.com.br");
        hosts.put(2, "receitasdecodigo.com.br");
        hosts.put(3, "anuncieon.com");
        hosts.put(4, "patobranco.anuncieon.com");


        // antes do Java 8
        for (Map.Entry<Integer, String> entry : hosts.entrySet()) {
            if ("anuncieon.com".equals(entry.getValue())) {
                System.out.println( "Antes do Java 8: " + entry.getValue() );
            }
        }

		// após o Java 8
        hosts.entrySet()
                .stream()
                .filter(map -> "anuncieon.com".equals(map.getValue()))
                .forEach( map -> System.out.println( "Após Java 8 : " + map.getValue() ) );


        // extraindo para uma variável
        Optional<String> result = hosts.entrySet()
            .stream()
            .filter(map -> "anuncieon.com".equals(map.getValue()))
            .map(map -> map.getValue())
            .findFirst();

        if ( result.isPresent() ) {
            System.out.println("Após Java 8 : " + result.get());
        }


        // filtro por código
        // listar todos os itens cujo código seja menor ou igual a 3

        // antes do Java 8
        for (Map.Entry<Integer, String> entry : hosts.entrySet()) {
            if (entry.getKey() <= 3 ) {
                System.out.println( "Antes do Java 8: " + entry.getValue() );
            }
        }


        // após o Java 8
        hosts.entrySet()
                .stream()
                .filter(map -> map.getKey() <= 3 )
                .forEach( map -> System.out.println( "Após Java 8 : " + map.getValue() ) );

        // extraindo para uma lista
        List<String> collect = hosts.entrySet()
                .stream()
                .filter(map -> map.getKey() <= 3)
                .map(map -> "Após Java 8 : " + map.getValue())
                .collect(Collectors.toList());

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

    }
}

Qualquer dúvida deixe nos comentários e não esqueça de compartilhar este artigo.


Não esqueca de deixar suas dúvidas nos comentários e compartilhar este post.


Apoiadores

Publique seu post no Receitas de Código

Aguarde, estamos trabalhando para que você possa publicar sua postagem no Receitas de Código!