Все дело было в "safeCompare". Он вносил сумятицу. Без него все выходит норм
return Objects.compare(o1, o2,
Comparator.<Worker, String>comparing(key -> key.fio().surname())
.thenComparing(key -> key.fio().name())
.thenComparing(Worker::salary)
.thenComparing(Worker::hiredOn));
Но так как у меня null значения, приходится делать так. Лучшего ничего не придумал.
class WorkerComparator implements Comparator<Worker> {
final static Comparator<String> safeString = Comparator.nullsFirst(Comparator.naturalOrder());
final static Comparator<Integer> safeInteger = Comparator.nullsFirst(Comparator.naturalOrder());
final static Comparator<LocalDateTime> safeLocalDateTime = Comparator.nullsFirst(Comparator.naturalOrder());
@Override
public int compare(Worker o1, Worker o2) {
return Objects.compare(o1, o2,
Comparator.<Worker, String>comparing(key -> key.fio().surname(), safeString)
.thenComparing(key -> key.fio().name(), safeString)
.thenComparing(Worker::salary, safeInteger)
.thenComparing(Worker::hiredOn, safeLocalDateTime));
}
}
Сделал под разные типы свой Comparator