Encodera

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.

Справочник Java

@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 и их комбинирование.

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.