• JP

Java: Streams API - Sorted

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;
    }
}

Sorted


O método Sorted() possibilita a ordenação de uma Collection através da passagem do campo em que deseja ser ordenado.

cidadesComPopulacaoMaiorQue20 =
        cidade.listaCidades()
                .stream()
                .sorted(Comparator.comparing(c -> c.nome))
                .collect(Collectors.toList());

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

No método sorted() é utilizado o método comparing da interface Comparator que aceita uma função como parâmetro e em seguida extrai retornando uma chave de ordenação. No exemplo anterior a ordenação é feita pelo campo Cidade.nome em ordem alfabética.


Saída:


Cidade: Albany /Estado: NY /População: 11

Cidade: Hollywood /Estado: CA /População: 30

Cidade: Houston /Estado: TX /População: 14

Cidade: New York /Estado: NY /População: 21

Cidade: Rio de Janeiro /Estado: RJ /População: 14

Cidade: São Paulo /Estado: SP /População: 90

Cidade: Venice /Estado: CA /População: 10

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 sorted é 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!

Posts recentes

Ver tudo