JP

8 de jan de 20202 min

Java: Streams API - Map

Desde o Java 8 lançado em 2014 foram adicionados dezenas de novas funcionalidades dentre melhorias na JVM e funções para facilitar a vida do desenvolvedor, pois ele merece. Dentre estas features, estão as Expression Lambda (EL) que foi o ponta pé inicial para a entrada do Java no mundo da programação funcional, melhoria na API de Data e a não necessidade de criar implementações de Interfaces já existentes com a utilização de Default methods.

E a outra novidade é a API de Streams, o foco desse post. A Stream API é uma nova abordagem para se trabalhar com Collections deixando o código menos verboso e mais inteligente.

A Stream API trabalha com o processamento de dados sob demanda e fornece dezenas de funcionalidades para manipular Collections diminuindo o código e simplificando o desenvolvimento em uma espécie de pipeline que será explicado mais a frente.

Vamos criar um Classe representando a entidade Cidade no qual terá como atributos: nome, estado e população. E por fim um método chamado listaCidades que carrega uma lista de objetos do tipo Cidade.

public class Cidade {
 

 
String nome;
 
String estado;
 
long populacao;
 

 
public Cidade(){}
 

 
public Cidade(String nome, String estado,
 
long populacao){
 
this.nome = nome;
 
this.estado = estado;
 
this.populacao = populacao;
 
}
 

 
public List<Cidade> listaCidades(){
 
List<Cidade> cidades = new ArrayList<Cidade>();
 
cidades.add(new Cidade("Hollywood", "CA", 30L));
 
cidades.add(new Cidade("Venice", "CA", 10L));
 
cidades.add(new Cidade("Houston", "TX", 14L));
 
cidades.add(new Cidade("New York", "NY", 21L));
 
cidades.add(new Cidade("Albany", "NY", 11L));
 
cidades.add(new Cidade("Rio de Janeiro", "RJ", 14L));
 
cidades.add(new Cidade("São Paulo", "SP", 90L));
 
return cidades;
 
}
 

 
@Override
 
public String toString() {
 
return "Cidade: " + nome +
 
" /Estado: " + estado +
 
" /População: " + populacao;
 
}
 
}

Map

O Map possibilita converter o objeto no tipo do campo que for passado como argumento

List<String> nomes =
 
cidade.listaCidades()
 
.stream()
 
.map(c -> c.nome)
 
.collect(Collectors.toList());
 

 
nomes.forEach(
 
c -> System.out.println(c)
 
);

No exemplo acima, no método map foi passado o campo nome do objeto Cidade, neste caso, ao invés de retornar a lista baseado nos objetos do tipo Cidade, será retornado uma lista do tipo String.

Saída:

Hollywood

Venice

Houston

New York

Albany

Rio de Janeiro

São Paulo

Outro exemplo com o campo Cidade.populacao

List<Long> listaPopulacao =
 
cidade.listaCidades()
 
.stream()
 
.map(c -> c.populacao)
 
.collect(Collectors.toList());
 

 
listaPopulacao.forEach(
 
c -> System.out.println(c)
 
);

Saída:

30

10

14

21

11

14

90

Resumindo, o map possibilita um cast para o campo do objeto em que você deseja que seja retornado.


Como funciona a pipeline?

Seguindo o exemplo anterior, a pipeline é um processo sequencial que se diferencia entre operações intermediárias e finais. No exemplo, a Stream é invocada a partir de uma fonte de dados (lista de objetos do tipo Cidade) que trabalha sob demanda, o método map é uma operação intermediária, ou seja, ela processa os dados até que o método collect é invocado, originando uma operação final.

E aí, curtiu? Até mais!

    0