Пояснение
Comparator
- это функциональный интерфейс (требуется только один метод).Таким образом, вы можете создавать его экземпляры с помощью лямбда-выражения.
Он ведет себя очень похоже на другие методы создания экземпляров, такие как обычный класс, который расширяется, или анонимный класс.
Лямбда относится к одному методу, который требуется функциональному интерфейсу.Поскольку существует только один метод, он не является неоднозначным.Лямбда называет входные аргументы и затем дает реализацию для метода (он обеспечивает тело ).
Обзор
Выесть следующие опции для создания экземпляров интерфейсов или абстрактных классов:
- Создание расширяемого класса и использование нового
- Использование анонимного класса
Предполагается, что у нас есть интерфейс, который предлагает только один метод (он называется функциональный интерфейс тогда), у нас дополнительно есть следующие две опции для создания его экземпляров:
Использовать лямбда-выражение Использовать ссылку на метод
В качестве примера мы хотим создать экземпляр умножения, используя следующий интерфейс:
@FunctionalInterface
public interface Operation {
int op(int a, int b);
}
Создайте класс, который расширяется и используйте новый:
public class Multiplicator implements Operation {
@Override
public int op(int a, int b) {
return a * b;
}
}
// Usage
Operation operation = new Multiplicator();
System.out.println(operation.op(5, 2)); // 10
Используйте анонимный класс:
Operation operation = new Operation() {
@Override
public int op(int a, int b) {
return a * b;
}
};
// Usage
System.out.println(operation.op(5, 2)); // 10
Используйте лямбда-выражение:
Operation operation = (a, b) -> a * b;
System.out.println(operation.op(5, 2)); // 10
Используйте ссылку на метод:
// Somewhere else in our project, in the `MathUtil` class
public static int multiply(int a, int b) {
return a * b;
}
// Usage
Operation operation = MathUtil::multiply;
System.out.println(operation.op(5, 2)); // 10