Почему лямбда-выражение можно использовать в качестве компаратора?

В книге OCP Study Guide приведен пример компаратора, который можно инициализировать двумя способами. Первый - через анонимный класс, подобный этому:

Comparator<Duck> byWeight = new Comparator<Duck>(){
    public int compare(Duck d1, Duck d2){
        return d1.getWeight() - d2.getWeight();
    }
};

Это я могу понять. Согласно книге это можно заменить лямбда-выражением, подобным этому:

Comparator<Duck> byWeight = (d1,d2) -> d1.getWeight() - d2.getWeight();

Теперь этого я не понимаю. Лямбда-выражение не возвращает объект Comparator, чего я не мог сейчас себе представить, поскольку Comparator является интерфейсом.

Так относится ли оператор new в первом примере к создаваемому анонимному классу, который называется Comparator, потому что этот анонимный класс реализует интерфейс Comparator?

Что именно происходит в примере 2 ? Объект создан как-то из лямбда-выражения? В этом примере вы используете byWeight в качестве ссылочной переменной, верно?

Я действительно не понимаю этого, кто-нибудь может объяснить, пожалуйста? Спасибо.

8
задан Stuart Marks 9 May 2017 в 15:06
поделиться