Создать метод, который принимает только значения в качестве параметра, который реализует Comparable <T> - PullRequest
0 голосов
/ 10 октября 2019

Я хочу получить повторяющийся код в метод, но не смог найти решение. Метод должен иметь другой тип типа, например String и Long, который реализует Comparable, чтобы использовать функцию compareTo().

Оригинал:

Comparator<Pair<String, Long>> PAIR_COMPARATOR_FIRST =
      (o1, o2) -> o1.getFirst() == null ? o2.getFirst() == null ? 0 : -1 : o2.getFirst() == null ? +1 : o1.getFirst().compareTo(o2.getFirst());
Comparator<Pair<String, Long>> PAIR_COMPARATOR_SECOND =
      (o1, o2) -> o1.getSecond() == null ? o2.getSecond() == null ? 0 : -1 : o2.getSecond() == null ? +1 : o1.getSecond().compareTo(o2.getSecond());

Что я пробовал: (не работает)

Comparator<Pair<String, Long>> PAIR_COMPARATOR_FIRST =
(o1, o2) -> nullProfCompare(o1.getFirst(), o2.getFirst());
Comparator<Pair<String, Long>> PAIR_COMPARATOR_SECOND =
(o1, o2) -> nullProfCompare(o1.getSecond(), o2.getSecond());

public static int nullProfCompare(Comparable<T> o1, T o2) {
    return o1 == null ? o2 == null ? 0 : -1 : o2 == null ? +1 : o1.compareTo(o2);
}

Я уже много пробовал, как с использованием instanceOf / isAssignableFrom, но ничего не действовало. Как должен выглядеть метод, чтобы принимать только те переменные, которые реализуют Comparable?

1 Ответ

1 голос
/ 10 октября 2019

Java 8 уже имеет реализацию с поддержкой нулей Comparator:

Похоже, ваш nullProfCompare совпадает с методом nullsFirst.

Вы также можете использовать Comparator.comparing(Function<? super T,? extends U> keyExtractor) метод для упрощения вашего кода:

Comparator<Pair<String, Long>> PAIR_COMPARATOR_FIRST =
        Comparator.nullsFirst(Comparator.comparing(Pair::getFirst));
Comparator<Pair<String, Long>> PAIR_COMPARATOR_SECOND =
        Comparator.nullsFirst(Comparator.comparing(Pair::getSecond));

Проблема с вашей реализацией nullProfCompare заключается в том, что вы используете T, даже не определяя его, и ваши два параметра не являютсятого же типа, которым они должны быть.

Вот правильная реализация:

public static <T extends Comparable<T>> int nullProfCompare(T o1, T o2) {
    return o1 == null ? o2 == null ? 0 : -1 : o2 == null ? +1 : o1.compareTo(o2);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...