Я думаю, вы ищете компаратор, подобный этому:
Comparator<MyClass> comparator = Comparator.comparing(MyClass::getId, Comparator.nullsLast(Comparator.reverseOrder()))
.thenComparing(MyClass::getCreateDate);
Код для его проверки:
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));
Вывод:
4 2019-06-14
4 2019-06-15
2 2019-06-14
null 2019-06-14
null 2019-06-15
Если вы хотите, чтобы nulls
был первым, просто измените nullsLast
на nullsFirst
.