@FunctionalInterface
Помечает интерфейс с ровно одним абстрактным методом — его можно реализовать лямбдой.
Доступно с: Java 8
Синтаксис
@Documented @Retention(RUNTIME) @Target(TYPE) public @interface FunctionalInterfaceПримеры
Свой функциональный интерфейс и лямбды для него:
@FunctionalInterface
interface Discount {
double apply(double price);
}
void main() {
Discount none = price -> price;
Discount tenPercent = price -> price * 0.9;
IO.println(none.apply(200));
IO.println(tenPercent.apply(200));
}Результат:
200.0
180.0Второй абстрактный метод — ошибка компиляции:
@FunctionalInterface
interface Discount {
double apply(double price);
String name();
}
void main() {
}Результат:
Main.java:1: error: Unexpected @FunctionalInterface annotationПримечания
Аннотация не обязательна: лямбдой можно реализовать любой интерфейс с одним абстрактным методом. Она лишь фиксирует намерение и не даёт случайно добавить второй абстрактный метод. Методы default и static, а также методы Object (equals, toString) не считаются. Перед тем как писать свой интерфейс, проверьте готовые в java.util.function: Function, Predicate, Supplier, Consumer.
См. также
- -> (lambda) — Лямбда-выражение — короткая запись функции, которую можно передать как значение.
- interface — Объявляет интерфейс — набор методов, которые обязуется реализовать класс.
- Function — Функция, которая принимает значение типа `T` и возвращает значение типа `R`.
- Predicate — Условие: функция, которая принимает значение и возвращает `boolean`.
В учебнике
- Функциональные интерфейсы — Функциональные интерфейсы в Java: аннотация @FunctionalInterface, стандартные Function, Predicate, Consumer, Supplier и их комбинирование.