Как можно улучшить класс `WorkerComparator` для избавления от необходимости явного приведения типа к `Worker` и предотвращения появления предупреждений компилятора при работе с методом `thenComparing` в Java?
Для настройки типизации класса Comparator следует использовать дженерики. Чтобы улучшить класс `WorkerComparator`, можно использовать дженерики для указания типа данных сравниваемых объектов, чтобы избежать необходимости явного приведения типа. Пример улучшенного класса `WorkerComparator` с использованием дженериков: ```java import java.util.Comparator; public class WorkerComparator implements Comparator<Worker> { @Override public int compare(Worker w1, Worker w2) { // реализация метода сравнения } } ``` Теперь для `WorkerComparator` указан тип данных `Worker` с использованием дженерика `<Worker>`, что позволяет избежать приведения типа при сравнении объектов типа `Worker`. Для избавления от предупреждений компилятора при использовании метода `thenComparing` в Java, необходимо также настроить типизацию для метода, указав тип данных ``WorkerComparator` в качестве аргумента: ```java Comparator<Worker> comparator = Comparator.comparing(Worker::getName) .thenComparing(new WorkerComparator()); ``` Таким образом, используя дженерики и корректно настроенные типы данных для класса `WorkerComparator`, можно улучшить его производительность и избежать предупреждений компилятора при работе с методом `thenComparing` в Java.
Все дело было в "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