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
Última atualização em: | 25930 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.