Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
@FunctionalInterface — Аннотация функциональных интерфейсов в Java
@FunctionalInterface — это аннотация, введённая в Java 8, которая отмечает интерфейс как функциональный интерфейс и обеспечивает проверку компилятором того, что интерфейс соответствует определению функционального интерфейса.
Определение функционального интерфейса
Функциональный интерфейс — это интерфейс, который имеет ровно один абстрактный метод (SAM — Single Abstract Method). Это условие необходимо для использования лямбда-выражений.
Что даёт @FunctionalInterface
- Контроль компилятора — если вы пометите интерфейс этой аннотацией, компилятор убедится, что он имеет ровно один абстрактный метод
- Документация — явно указывает, что это функциональный интерфейс
- Защита от ошибок — если кто-то добавит второй метод, компилятор выдаст ошибку
Примеры
@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 — это не обязательная аннотация (код работает и без неё), но её использование:
- Улучшает читаемость кода
- Защищает от случайных изменений
- Явно показывает намерение разработчика
- Позволяет компилятору проверить корректность