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.