Caba da TI

Caba da TI

Como ordenar uma lista de objetos por uma propriedade específica utilizando Stream API (Java 8)

Solução

Exemplo 1 – Ordenando a lista por uma única propriedade específica dos objetos

import java.util.Arrays;
import java.util.Comparator;
import java.util.List;
import java.util.stream.Collectors;

public class OrdenacaoListaPorPropriedadeEspecifica {

  public static void main(String[] args) {
    // Criação da lista para testes
    List<Pessoa> pessoas = Arrays.asList(new Pessoa("Francisco", 50),
        new Pessoa("Francisco", 48), new Pessoa("Antônio", 51),
        new Pessoa("Raimundo", 49));

    // Realizando a ordenação e atribuindo a lista ordenada à nova variável
    List<Pessoa> pessoasOrdenadasPorNome = pessoas.stream()
        .sorted(Comparator.comparing(Pessoa::getNome))
        .collect(Collectors.toList());

    // O resultado final será a lista ordenada pelo nome das pessoas, sem
    // considerar a idade na ordenação:
    // [Antônio-51, Francisco-50, Francisco-48, Raimundo-49]
    System.out.println(pessoasOrdenadasPorNome);
  }
}

class Pessoa {
  private String nome;
  private int idade;

  public Pessoa(String nome, int idade) {
    this.nome = nome;
    this.idade = idade;
  }

  public String getNome() {
    return nome;
  }

  public void setNome(String nome) {
    this.nome = nome;
  }

  public int getIdade() {
    return idade;
  }

  public void setIdade(int idade) {
    this.idade = idade;
  }

  public String toString() {
    return this.nome + "-" + this.idade;
  }
}

Exemplo 2 – Ordenando a lista por mais de uma propriedade dos objetos

import java.util.Arrays;
import java.util.Comparator;
import java.util.List;
import java.util.stream.Collectors;

public class OrdenacaoListaPorMaisDeUmaPropriedade {

  public static void main(String[] args) {
    // Criação da lista para testes
    List<Pessoa> pessoas = Arrays.asList(new Pessoa("Francisco", 50),
        new Pessoa("Francisco", 48), new Pessoa("Antônio", 51),
        new Pessoa("Raimundo", 49));

    // Realizando a ordenação e atribuindo a lista ordenada à nova variável
    List<Pessoa> pessoasOrdenadasPorNomeEIdade = pessoas.stream()
        .sorted(Comparator.comparing(Pessoa::getNome)
            .thenComparing(Pessoa::getIdade)) // depois ordena pela idade
        .collect(Collectors.toList()); // transforma a stream ordenada em uma
                                       // lista

    // O resultado final deve ser o seguinte texto no console, ordenado por nome
    // e depois por idade:
    // [Antônio-51, Francisco-48, Francisco-50, Raimundo-49]
    System.out.println(pessoasOrdenadasPorNomeEIdade);
  }

}

class Pessoa
{
   private String nome;
   private int idade;

   public Pessoa(String nome, int idade) {
      this.nome = nome;
      this.idade = idade;
   }

   public String getNome()
   {
      return nome;
   }
   public void setNome(String nome)
   {
      this.nome = nome;
   }
   public int getIdade()
   {
      return idade;
   }
   public void setIdade(int idade)
   {
      this.idade = idade;
   }

   public String toString(){
      return this.nome + "-" + this.idade;
   }
}

Explicação

Os exemplos acima mostram a ordenação de uma lista utilizando a Stream API (Java 8). Para ordenar a lista a primeira coisa a ser feita é transformá-la em uma stream, através do código pessoas.stream(), depois utiliza o método sorted() do stream, que recebe como parâmetro um Comparator . Após passar o comparator para o método que realiza a ordenação, podemos transformar a stream novamente em lista através do método collect().

No segundo exemplo a diferença é que como precisamos ordenara por duas propriedades (nome e idade), precisamos criar um Comparator passando essas duas propriedades, da seguinte forma: Comparator.comparing(Pessoa::getNome).thenComparing(Pessoa::getIdade). Nesse caso o método comparing cria um comparator que compara por nome da pessoa e depois ao chamarmos o método themComparing no prórprio comparator criado, será retornado um comparator que compara por nome e idade.

Outras soluções

Outras formas de realizar ordenação de lista de forma simples seria utilizando Collections.sort(pessoas, Comparator.comparing(Pessoa::getNome)) ou então o método introduzido na interface List a partir do Java 8: pessoas.sort(Comparator.comparing(Pessoa::getNome)). Importante atentar que diferentemente da solução utilizando stream, essas duas soluções alteram a própria lista passada como argumento.

Referências

Java 8 – How to sort list with stream.sorted()

Sorting in Collection

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *