Comparador de Java con campos nulos

Sergio Lema :

Tengo una lista de las entidades Entitycon los campos idy createdDate. Quiero clasificarlos de la siguiente manera:

  • más alto idprimero
  • Si idnula, más reciente createdDateprimero

He intentado lo siguiente unsuccessfuly, ya que un throwns NullPointerExceptioncuando ides nula

Comparator comp = Comparator
                .nullsFirst(Comparator.comparing(e -> ((Entity) e).getId()))
                .thenComparing(e -> ((Entity e).getCreatedDate())
                .reversed();
entities.stream().sorted(comp).findFirst();

Por lo que veo, Comparator.nullsFirstmangos cuando la entidad es nulo, no cuando el campo para ser comparada es nulo. ¿Cómo puedo manejar esta situación?

Michalk:

Creo que busca comparador de esta manera:

Comparator<MyClass> comparator = Comparator.comparing(MyClass::getId, Comparator.nullsLast(Comparator.reverseOrder()))
                .thenComparing(MyClass::getCreateDate);

El código para probarlo:

List<MyClass> list = new ArrayList<>();

list.add(new MyClass(null, LocalDate.now()));
list.add(new MyClass(4L, LocalDate.now()));
list.add(new MyClass(2L, LocalDate.now()));
list.add(new MyClass(4L, LocalDate.now().plusDays(1)));
list.add(new MyClass(null, LocalDate.now().plusDays(1)));

Comparator<MyClass> comparator = Comparator.comparing(MyClass::getId, Comparator.nullsLast(Comparator.reverseOrder()))
                .thenComparing(MyClass::getCreateDate);

list.stream().sorted(comparator).forEach(myClass -> System.out.println(myClass.id + " " + myClass.createDate));

La salida es:

4 2019-06-14
4 2019-06-15
2 2019-06-14
null 2019-06-14
null 2019-06-15

Si quieres nullsser el primero acaba de cambiar nullsLasta nullsFirst.

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=226305&siteId=1
Recomendado
Clasificación