Вопрос проверяет знание функциональных интерфейсов Java, используемых в лямбда-выражениях и Stream API.
Predicate, Function и Consumer — это встроенные функциональные интерфейсы из пакета java.util.function, которые появились в Java 8 для поддержки лямбда-выражений и Stream API. Они позволяют передавать поведение как параметр метода, делая код более гибким и лаконичным.
Интерфейс Predicate содержит метод test(T t), который принимает объект типа T и возвращает boolean. Он часто используется для фильтрации элементов в коллекциях или стримах.
Predicate<String> isLong = s -> s.length() > 5;
boolean result = isLong.test("Hello"); // falseИнтерфейс Function имеет метод apply(T t), который принимает объект типа T и возвращает объект типа R. Применяется для преобразования данных, например, извлечения поля или изменения формата.
Function<String, Integer> getLength = s -> s.length();
int len = getLength.apply("Java"); // 4Интерфейс Consumer содержит метод accept(T t), который принимает объект типа T и ничего не возвращает (void). Используется для выполнения побочных эффектов, таких как вывод на экран или запись в файл.
Consumer<String> print = s -> System.out.println(s);
print.accept("Hello"); // выводит HelloЭти интерфейсы активно используются в методах Stream API: filter (Predicate), map (Function), forEach (Consumer). Например:
List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
names.stream()
.filter(s -> s.length() > 3) // Predicate
.map(String::toUpperCase) // Function
.forEach(System.out::println); // ConsumerВывод: Predicate, Function и Consumer — это основа функционального программирования в Java. Их стоит применять при работе с коллекциями, стримами и для передачи простых операций в методы, чтобы избежать избыточного кода и улучшить читаемость.