Caba da TI

Caba da TI

Como evitar NullPointerException ao ordenar uma lista que contenha objetos nulos utilizando Comparator com Lambda expression

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

Deixe um comentário

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