2016-06-23 6 views
2

В коде ниже:Как работает функция Comparator.comparing()?

ForComparatorDemo object1 = new ForComparatorDemo("object-1",5); 
ForComparatorDemo object2 = new ForComparatorDemo("object-2",4); 
ForComparatorDemo object3 = new ForComparatorDemo("object-3",3); 
ForComparatorDemo object4 = new ForComparatorDemo("object-4",4); 

List<ForComparatorDemo> objectList = new ArrayList<>(); 
objectList.add(object1); 
objectList.add(object2); 
objectList.add(object3); 
objectList.add(object4); 
Comparator<ForComparatorDemo> comparer = Comparator.comparing(ForComparatorDemo::getAge); 
objectList.sort(comparer); 
objectList.forEach(object -> System.out.println(object.getName() + " " + object.getAge())); 

Я получил этот вывод (что правильно):

объект-3 3

объект-2 4

объект-4 4

объект-1 5

Вопрос в том, как что функция сравнения действительно работает? Порывшись в документации я нашел этот код для Coamparator.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)); 
} 

Не могли бы вы объяснить мне, как эта функция получает эти два значения (c1 и с2) и как это возвращение заявление фактически работает ?

ответ

2

Способ comparing() не сравнивает вещи.

Он возвращает новый компаратор, который описывается как лам. Это возможно, поскольку интерфейс компаратора является FunctionalInterface.

Таким образом, этот код

(Comparator<T> & Serializable) 
     (c1, c2) -> keyExtractor.apply(c1).compareTo(keyExtractor.apply(c2)); 

является эквивалентом:

new Comparator<T>() { 
    int compare(T c1, T c2) { 
     return keyExtractor.apply(c1).compareTo(keyExtractor.apply(c2)); 
    } 
} 

Так c1 и c2 имена аргументов.

Элементы сравниваются по клавишам, которые извлекаются keyExtractor Функция.

Фактический объект передается в метод compare() из мест, где фактически используются компараторы. Обычно это разные методы сортировки, где все значения сбора повторяются через цикл или итератор и сравниваются друг с другом по некоторому внешнему значению. Например, вы можете проверить Arrays.mergeSort.

+0

Ну, что я действительно искал, так это то, как эта функция получает аргументы c1 и c2, а ответ на это - из интерфейса List, который я нашел после обработки в документации –

+0

. Я добавил часть об использовании компаратора. – arghtype

Смежные вопросы