Sergio Lema :
Tengo una lista de las entidades Entity
con los campos id
y createdDate
. Quiero clasificarlos de la siguiente manera:
- más alto
id
primero - Si
id
nula, más recientecreatedDate
primero
He intentado lo siguiente unsuccessfuly, ya que un throwns NullPointerException
cuando id
es 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.nullsFirst
mangos 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 nulls
ser el primero acaba de cambiar nullsLast
a nullsFirst
.