Usando Filter do Java 8 em Map

Postado em por Wolmir Cezer Garbin em Java | 361 Visualizações
Última atualização em:

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

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.


Tem algo para vender? AnuncieOn.com

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


Wolmir Cezer Garbin

Wolmir Cezer Garbin


Sou formado em Desenvolvimento de Sistemas para Internet pela faculdade Mater Dei e Pós graduado em Desenvolvimento de sistemas em Java pela UTFPR. Trabalho a mais de 9 anos com desenvolvimento em Java, Android e Web utilizando as principais tecnologias do mercado. Atuo como professor na faculdade Mater Dei, programador na Garbo Software e criador do Receitas de Código.

Ver mais

Tem algo para vender? AnuncieOn.com

FIQUE POR DENTRO

Receba as novidades todo mês em seu e-mail!

Apoiadores

Code Conference

Esta é uma conferência de código realizada na cidade de Pato Branco para dissiminar tendências e informações sobre programação e novas tecnológias

Veja mais sobre o Code Conference

Publique seu post no Receitas de Código

Agora você pode publicar seu post no Receitas de Código e compartilhar seu conhecimento com muitas pessoas!

Quero publicar