Как работает извлечение ключей с помощью метода Java Comparator.comparing ()?

#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. Это странно видеть, потому что я думаю о лямбдах как об анонимных классах, которые вы передаете параметрам метода непосредственно в качестве аргумента.