В Java 8+ функциональное программирование стало важной частью языка. Ключевые понятия здесь — функциональные интерфейсы. Это интерфейсы, содержащие ровно один абстрактный метод. Пакет java.util.function предоставляет готовые решения для большинства задач.
Два наиболее часто используемых интерфейса — это Predicate и Consumer.
Predicate(Предикат) — принимает объект типа T и возвращаетboolean. Его метод —test(T t). Используется для проверки условий и фильтрации данных (например, «число больше нуля»).Consumer(Потребитель) — принимает объект типа T и ничего не возвращает (void). Его метод —accept(T t). Используется для выполнения действий над объектом, например, вывода в консоль или сохранения в базу.
Изучение этих интерфейсов поможет вам писать лаконичный и выразительный код, особенно при работе со Stream API.
- Модуль 1: Первая программа и структура
- Модуль 2: Переменные и типы данных
- Объявление и инициализация переменных.
- Примитивы: целые числа (int, long, byte, short).
- Примитивы: дробные числа (double, float).
- Примитивы: логический тип (boolean).
- Примитивы: символьный тип (char).
- String — основы работы со строками.
- Приведение типов (Casting): расширение и сужение.
- Область видимости переменных (Scope).
- Модуль 3: Операторы
- Модуль 4: Управляющие конструкции
- Модуль 5: Массивы и Строки (Advanced)
- Создание и заполнение массива.
- Доступ к элементам по индексу.
- Свойство length и перебор массива.
- Цикл for-each для массивов.
- Многомерные массивы.
- Методы String: length, charAt, isEmpty.
- Манипуляции: substring, concat, replace.
- Сравнение строк: equals vs ==.
- Разделение строк (split) и trim.
- StringBuilder (изменяемые строки).
- Модуль 6: Методы
- Модуль 7: Классы и Объекты (ООП Часть 1)
- Модуль 8: Капсуляция и Модификаторы
- Модуль 9: Наследование и Полиморфизм (ООП Часть 2)
- Модуль 10: Обработка исключений
- Модуль 11: Коллекции и Дженерики
- Модуль 12: Функциональный стиль (Java 8+)
- Модуль 13: Полезные стандарты
1. Интерфейс и метод
В левой колонке перечислены названия функциональных интерфейсов из Java 8+, а в правой — названия их абстрактных методов. Сопоставьте каждый интерфейс с соответствующим методом. Обратите внимание, что в правой колонке нет лишних вариантов, но порядок методов перемешан.
Predicate<T>Consumer<T>Function<T, R>accept(T t)apply(T t)test(T t)2. Объявление Predicate
Дополните фрагмент кода, в котором объявляется функциональный интерфейс Predicate для проверки длины строки. Predicate — это функциональный интерфейс из пакета java.util.function, который принимает один аргумент и возвращает boolean. Вам нужно указать тип параметра дженерика и вызвать метод проверки для тестирования предиката на конкретной строке. Результат выполнения должен вывести true, если строка имеет длину больше 5 символов.
import java.util.function.Predicate;
public class Main {
public static void main(String[] args) {
Predicate<input1S> isLongString = s -> s.length() > 5;
boolean result = isLongString.input2S("Hello, World!");
System.out.println(result);
}
}3. Результат условия
Проанализируйте приведённый код на Java, использующий функциональный интерфейс Predicate для проверки числа на чётность. Определите, какое значение будет возвращено при вызове метода test() с указанным аргументом. Внимательно изучите лямбда-выражение и переданное значение.
import java.util.function.Predicate;
public class Main {
public static void main(String[] args) {
Predicate<Integer> isEven = n -> n % 2 == 0;
boolean result = isEven.test(5);
// Какое значение примет переменная result?
}
}4. Ошибка в Consumer
В данном фрагменте кода используется функциональный интерфейс Consumer для вывода текста в консоль. Однако в коде допущена ошибка: вместо правильного метода интерфейса Consumer используется несуществующий метод. Исправьте строку с ошибкой, чтобы код корректно вывел текст на экран.
import java.util.function.Consumer; public class Main { public static void main(String[] args) { Consumer<String> consumer = s -> System.out.println(s); consumer.print("Hello, World!"); }}5. Лямбда для Consumer
В данном задании вам предстоит дополнить код, использующий функциональный интерфейс Consumer, правильными лямбда-выражениями. В коде есть два вызова метода processString, каждый из которых принимает строку и Consumer. Вам нужно выбрать из выпадающего списка подходящие лямбда-выражения, чтобы первый Consumer выводил строку в верхнем регистре, а второй — длину строки. Обратите внимание на синтаксис лямбда-выражений в Java.
import java.util.function.Consumer;
public class Main {
public static void processString(String str, Consumer<String> consumer) {
consumer.accept(str);
}
public static void main(String[] args) {
processString("Hello", input1S);
processString("Hello", input2S);
}
}6. Цепочка действий
Из предложенных строк соберите корректную java-программу, которая создаёт список строк, объявляет Consumer для вывода каждого элемента в отдельной строке и применяет этот Consumer к списку через forEach. Лишние строки (другие способы вывода или дополнительные действия) в решение включать не нужно.
import java.util.List;import java.util.function.Consumer;public class Main { public static void main(String[] args) { List<String> list = List.of("A", "B", "C"); Consumer<String> consumer = s -> System.out.println(s); list.forEach(consumer); list.forEach(s -> System.out.println(s)); System.out.println(list); }}7. Типы в лямбдах
В данном фрагменте кода Java, связанном с функциональными интерфейсами, разметьте все вхождения имён интерфейсов (Predicate, Consumer) и соответствующие им вызовы методов. Для каждого выделенного сегмента укажите, является ли он именем интерфейса или вызовом метода. Это упражнение поможет закрепить умение идентифицировать ключевые элементы функционального стиля программирования в Java.
{{Predicate~|~t1}}<String> isEmpty = s -> s.isEmpty();
{{Consumer~|~t2}}<String> printer = s -> System.out.println(s);
if (isEmpty.{{test~|~t3}}("example")) {
printer.{{accept~|~t4}}("Empty string");
}
{{Predicate~|~t5}}<Integer> isPositive = n -> n > 0;
{{Consumer~|~t6}}<Integer> printSquare = n -> System.out.println(n * n);
isPositive.{{test~|~t7}}(5);
printSquare.{{accept~|~t8}}(5);