Quando utilizamos um comparator, via lambda expression, para ordenar uma lista, seja pela método Stream.sorted, Collections.sort ou também pelo List.sort; caso haja algum objeto nulo na lista, será lançado um erro parecido com o seguinte: java.lang.NullPointerException at java.base/java.util.Comparator.lambda$comparing$77a9974f$1(Comparator.java:473)
Uma forma de resolver esse erro é utilizando Comparator.nullsLast ou Comparator.nullsFirst, da seguinte forma:
import java.util.Arrays;
import java.util.Comparator;
import java.util.List;
import java.util.stream.Collectors;
public class OrdenacaoListaComValoresNulos {
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), null);
// Realizando a ordenação e atribuindo a lista ordenada à nova variável
List<Pessoa> pessoasOrdenadasPorNomeComNuloNoFinal = pessoas.stream()
.sorted(Comparator.nullsLast(Comparator.comparing(Pessoa::getNome)))
.collect(Collectors.toList());
// O resultado final será a lista ordenada pelo nome das pessoas,
// com os objetos nulos no final da lista
System.out.println(pessoasOrdenadasPorNomeComNuloNoFinal);
// Resultado no console: [Antônio-51, Francisco-50, Francisco-48, Raimundo-49, null]
}
}
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
Ao criarmos o comparator com a expressão lambda Comparator.comparing(Pessoa::getNome), o comparator criado não está validando nulos, o que leva a um NullPointerException caso haja algum valor nulo na lista a ser ordenada. Para evitar esse erro, podemos criar um comparator que verifique valores nulos, utilizando para isso o método Comparator.nullsLast ou Comparator.nullsFirst. Esses métodos recebem como parâmetro um comparator e retornam um novo comparator que ordena os valores nulos, evitando assim o erro de nullpointer. A diferença dos dois é que o Comparator.nullsLast retorna o comparator que jogará os nulos para o final da lista, enquanto que o Comparator.nullsFirst retorna um comparator que jogará os nulos para o início da lista