LINUX.ORG.RU

Раскройте тайну thenComparing

 , ,


0

1

Доброго времени суток. Объясните, как работает thenComparing класса Comparator, когда передаешь туда ссылку на метод. В документации написано, что это должен быть keyExtractor, который НЕ принимает аргументы. Тогда почему new MyComp().thenComparing(MyClass::compareTo); компилируется. Где в документации описание такого варианта thenComparing? Юзаю JDK8, внизу пример.

import java.util.Comparator;

class MyClass
    implements Comparable<MyClass> {

    String ftitle;
    String stitle;

    @Override
    public int compareTo(MyClass obj) {
        return ftitle.compareTo(obj.ftitle);
    }

    public int hello() {
        return 1;
    }
}

class MyComp
    implements Comparator<MyClass> {

    @Override
    public int compare(MyClass f, MyClass s) {
        return f.stitle.compareTo(s.stitle);
    }
}

class Main {
    public static void main(String[] args) {
        new MyComp().thenComparing(MyClass::compareTo); //OK

        new MyComp().thenComparing(Comparator.comparing(MyClass::hello));       //OK
        //new MyComp().thenComparing(Comparator.comparing(MyClass::compareTo)); //ERROR
    }
}

Оно принимает функцию, которая принимает _селектор_ поля, которое нужно сравнивать. Вот и все.

cdshines ★★★★★
()
Ответ на: комментарий от cdshines

Не обратил внимание, что Comparator функциональный. В данном случае метод реализует compare (т.е ссылка разворачивается в компаратор, а не keyExtractor). Спасибо за ответ

Rot1
() автор топика
Последнее исправление: Rot1 (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.