← Назад к вопросам

Что дает @FunctionalInterface

1.3 Junior🔥 181 комментариев
#Основы Java

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

@FunctionalInterface — Аннотация функциональных интерфейсов в Java

@FunctionalInterface — это аннотация, введённая в Java 8, которая отмечает интерфейс как функциональный интерфейс и обеспечивает проверку компилятором того, что интерфейс соответствует определению функционального интерфейса.

Определение функционального интерфейса

Функциональный интерфейс — это интерфейс, который имеет ровно один абстрактный метод (SAM — Single Abstract Method). Это условие необходимо для использования лямбда-выражений.

Что даёт @FunctionalInterface

  1. Контроль компилятора — если вы пометите интерфейс этой аннотацией, компилятор убедится, что он имеет ровно один абстрактный метод
  2. Документация — явно указывает, что это функциональный интерфейс
  3. Защита от ошибок — если кто-то добавит второй метод, компилятор выдаст ошибку

Примеры

@FunctionalInterface
public interface Calculator {
    int calculate(int a, int b);
}

Теперь можно использовать лямбда-выражение:

Calculator add = (a, b) -> a + b;
Calculator multiply = (a, b) -> a * b;

int result1 = add.calculate(5, 3);       // 8
int result2 = multiply.calculate(5, 3);  // 15

Встроенные функциональные интерфейсы

Java поставляет готовые функциональные интерфейсы в пакете java.util.function:

// Consumer<T> — принимает значение, ничего не возвращает
Consumer<String> printer = (s) -> System.out.println(s);
printer.accept("Hello");

// Supplier<T> — возвращает значение
Supplier<String> greeting = () -> "Hello, Java!";
String message = greeting.get();

// Function<T, R> — преобразует T в R
Function<Integer, Integer> square = (x) -> x * x;
int result = square.apply(5);  // 25

// Predicate<T> — проверяет условие
Predicate<Integer> isEven = (x) -> x % 2 == 0;
boolean even = isEven.test(4);  // true

Проверка: ошибка с двумя методами

@FunctionalInterface
public interface Wrong {
    void method1();
    void method2();  // Ошибка! Компилятор не позволит
}

Статические и default методы

Функциональный интерфейс может иметь статические и default методы, но только ОДИН абстрактный:

@FunctionalInterface
public interface Comparator {
    int compare(Object o1, Object o2);  // Абстрактный метод
    
    default void sort(List<Object> list) {
        // Default реализация
    }
    
    static Comparator reverse(Comparator comp) {
        return (o1, o2) -> comp.compare(o2, o1);
    }
}

Практическое использование

Функциональные интерфейсы — основа для работы со Stream API, параллельной обработкой и функциональным программированием в Java:

List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
numbers.stream()
    .filter(n -> n % 2 == 0)  // Predicate — функциональный интерфейс
    .map(n -> n * n)          // Function — функциональный интерфейс
    .forEach(System.out::println);  // Consumer — функциональный интерфейс

Заключение

@FunctionalInterface — это не обязательная аннотация (код работает и без неё), но её использование:

  • Улучшает читаемость кода
  • Защищает от случайных изменений
  • Явно показывает намерение разработчика
  • Позволяет компилятору проверить корректность