Вопрос проверяет знание стандартных функциональных интерфейсов Java, которые являются основой для лямбда-выражений и Stream API.
Функциональный интерфейс в Java — это интерфейс, который содержит ровно один абстрактный метод. Такие интерфейсы служат типами для лямбда-выражений и ссылок на методы. Начиная с Java 8, в пакете java.util.function появился набор стандартных функциональных интерфейсов, покрывающих большинство типовых сценариев.
boolean test(T t). Используется для проверки условия. Пример: фильтрация элементов в Stream.void accept(T t). Выполняет действие над объектом, не возвращая результат. Пример: вывод элементов в консоль.R apply(T t). Преобразует объект одного типа в другой. Пример: извлечение поля из объекта.T get(). Поставляет объект без входных параметров. Пример: фабрика объектов.import java.util.function.*;
public class FunctionalInterfacesExample {
public static void main(String[] args) {
// Predicate: проверка, что число положительное
Predicate<Integer> isPositive = x -> x > 0;
System.out.println(isPositive.test(5)); // true
// Consumer: вывод строки
Consumer<String> printer = s -> System.out.println(s);
printer.accept("Hello"); // Hello
// Function: длина строки
Function<String, Integer> lengthFunc = s -> s.length();
System.out.println(lengthFunc.apply("Java")); // 4
// Supplier: случайное число
Supplier<Double> randomSupplier = () -> Math.random();
System.out.println(randomSupplier.get());
}
}Кроме четырёх основных, есть их специализации: BiPredicate<T, U>, BiConsumer<T, U>, BiFunction<T, U, R>, а также UnaryOperator<T> (Function, где вход и выход одного типа) и BinaryOperator<T> (BiFunction с одинаковыми типами). Также существуют примитивные версии: IntPredicate, DoubleConsumer и т.д., которые избегают автоупаковки.
Эти интерфейсы активно используются в Stream API (например, filter принимает Predicate, map — Function, forEach — Consumer), в CompletableFuture, в Optional и при работе с коллекциями. Они позволяют писать более декларативный и лаконичный код.
Вывод: Стандартные функциональные интерфейсы — это основа функционального программирования в Java. Их знание необходимо для эффективной работы с лямбда-выражениями, Stream API и современными Java-библиотеками.