Функциональный интерфейс — это интерфейс, который определяет только один абстрактный метод. Это позволяет передавать поведение как значение — например, в виде лямбды или ссылки на метод.
Рассмотрим простейший пример:
@FunctionalInterface
interface Greeting {
void say(String message);
}
Greeting g = msg -> System.out.println("Привет, " + msg);
g.say("мир!");
Аннотация @FunctionalInterface не обязательна, но рекомендуема — она защищает от случайного добавления лишнего абстрактного метода.
Интерфейс может содержать сколько угодно
default-
и static
-методов и при этом оставаться функциональным, так как они не считаются абстрактными.В Java предусмотрен набор стандартных функциональных интерфейсов — в пакете
java.util.function
. Вот наиболее часто используемые:▶️ Predicate<T> — проверяет условие, возвращает true или false▶️ Function<T, R> — преобразует один тип в другой▶️ Consumer<T> — принимает значение, ничего не возвращает▶️ Supplier<T> — возвращает значение, ничего не принимает▶️ UnaryOperator<T> и BinaryOperator<T> — частные случаи Function, когда вход и выход одного типа
Пример использования Predicate:
Predicate<String> isLong = s -> s.length() > 5;
System.out.println(isLong.test("Java")); // false
Функциональные интерфейсы активно используются в Stream API, Optional, Comparator, CompletableFuture и других частях стандартной библиотеки. Это удобный способ описать поведение без лишнего кода.