#java #interface #comparator #comparable #method-reference
Вопрос:
API Java определяет следующее для метода comparing() в интерфейсе Comparator<T> :
static <T,U extends Comparable<? super U>> Comparator<T> comparing (Function<? super T,? extends U> keyExtractor)
Принимает функцию, которая извлекает сопоставимый ключ сортировки из типа T,
и возвращает компаратор, который сравнивает по этому ключу сортировки.
Возвращаемый компаратор сериализуем, если указанная функция также
сериализуема.Например, чтобы получить Компаратор, который сравнивает объекты-лица по их фамилии,
Comparator<Person> byLastName = Comparator.comparing(Person::getLastName);
Мой вопрос в том, что происходит, когда вызывается метод <T>сравнения этого компаратора(T t1, T t2)? Например, предположим persons
, что это список<Человек>, который сортируется с помощью компаратора, ранее определенного выше:
Collections.sort(persons, byLastName);
Предполагая getLastName
, что возвращает строку, которая реализует Comparable<String>
, как именно byLastName
сравниваются ключи, извлеченные с помощью getLastName
? Вызывает ли компаратор неявно что-то вроде return t1.getLastName().compareTo(t2.getLastName())
?
Комментарии:
1. Как насчет того, чтобы просто посмотреть, как это реализовано в OpenJDK ?
2. Спасибо, мне это не пришло в голову. Аналогично, мне не приходило в голову, что функциональный интерфейс может использоваться в качестве возвращаемого типа, и, следовательно, лямбда-выражение может встречаться в операторе return. Это странно видеть, потому что я думаю о лямбдах как об анонимных классах, которые вы передаете параметрам метода непосредственно в качестве аргумента.