Как работает Comparator в Java

294
07 февраля 2018, 12:50

Читаю Хорстмана Java 8 издание. В одной из глав используются статические методы интерфейса Comparator. До дженериков еще не дошел, но примерно понимаю что это. В этом интерфейсе есть метод comparing:

public static <T, U extends Comparable<? super U>> Comparator<T> comparing(
        Function<? super T, ? extends U> keyExtractor)
{
    Objects.requireNonNull(keyExtractor);
    return (Comparator<T> & Serializable)
        (c1, c2) -> keyExtractor.apply(c1).compareTo(keyExtractor.apply(c2));
}

Не могу понять как он работает. Что значит возвращаемый методом тип:

<T, U extends Comparable<? super U>> Comparator<T> 

и в операторе return, это приведение к типу, или еще что?

(Comparator<T> & Serializable)

Было бы хорошо, если кто-то мог объяснить построчно, что происходит в этом методе.

Answer 1
public static <T, U extends Comparable<? super U>> Comparator<T> comparing(...)
  1. Comparator<T> - возвращаемый параметризованный тип, где T - параметр заведомо неизвестного типа, но во время выполнения будет известен. Данный параметр объявлен в следующей записи: <T, U extends Comparable<? super U>>, поэтому далее в внутри метода можно использовать параметр типа T.
  2. <T, U extends Comparable<? super U>> - объявляет два типовых параметра: первый - T, второй - U. Параметр типа U может быть любым типом, наследующим Comparable. Comparable в свою очередь может быть параметризован любым типом, который не выходит за границы U. Получается параметр U может быть любым типом между Comparable и U.
Answer 2
  • Function keyExtractor функция берёт обьект класса T или его суперкласс (не спрашивай почему не субкласс) извлекает ключ класса U или его субкласс
  • Метод возвращает функцию класса Comparator которая сравнивает обьекты T по их ключам U
  • (Comparator & Serializable) каст типов к первому и второму интерфейсу... хм, хотя метод сам возвращает только Comparator поэтому второй каст без толку
  • U extends Comparable U это такое "сравнимое", что может быть сравнено с каким-то своим суперклассом.

но во время выполнения будет известен.

во время выполнения ничего не известно так как в Java стираются типы. И ещё, опять таки из за этого можно не заморачиваться с типами. Метод .compareTo выполнится в зависимости от того какой в действительности это обьект с его создания, а не от того какой у него сейчас каст.

READ ALSO
Хранение фрагментов в активити

Хранение фрагментов в активити

В активити с BottomNavigation всего 3 путкта меню и 3 фрагмента которые переключаются при навигацииДля одного из них нужно всегда хранить состояние

199
Замена символов в строке Java

Замена символов в строке Java

Метод string = stringreplace("a", "b"); заменит все буквы

186
Выгрузка файла через WebView Android

Выгрузка файла через WebView Android

Вообщем код брал с примеров от гуглаsetUpWebViewDefaults(mWebView); вызываю при старте соответственно

199
Лента уведомлений

Лента уведомлений

Как реализовать чтобы при нажатии на уведомление открывалось приложение и содержимое уведомления(Заголовок, Текст сообщения) добавлялось...

169