Функциональные интерфейсы (Predicate, Consumer)

Тренажер по Java для пользователей с начальным уровнем подготовки.

Тренажер по Java

В Java 8+ функциональное программирование стало важной частью языка. Ключевые понятия здесь — функциональные интерфейсы. Это интерфейсы, содержащие ровно один абстрактный метод. Пакет java.util.function предоставляет готовые решения для большинства задач.

Два наиболее часто используемых интерфейса — это Predicate и Consumer.

  • Predicate (Предикат) — принимает объект типа T и возвращает boolean. Его метод — test(T t). Используется для проверки условий и фильтрации данных (например, «число больше нуля»).
  • Consumer (Потребитель) — принимает объект типа T и ничего не возвращает (void). Его метод — accept(T t). Используется для выполнения действий над объектом, например, вывода в консоль или сохранения в базу.

Изучение этих интерфейсов поможет вам писать лаконичный и выразительный код, особенно при работе со Stream API.

Список тем

1. Интерфейс и метод

id: 40516_func_01_compare_methods

В левой колонке перечислены названия функциональных интерфейсов из Java 8+, а в правой — названия их абстрактных методов. Сопоставьте каждый интерфейс с соответствующим методом. Обратите внимание, что в правой колонке нет лишних вариантов, но порядок методов перемешан.

Сопоставьте строки в правой(нижней) части с соответствующими строками в левой(верхней) по порядковому номеру
Predicate<T>
Consumer<T>
Function<T, R>
accept(T t)
apply(T t)
test(T t)
Сообщения
Проверить
Показать подсказку

2. Объявление Predicate

id: 40516_func_02_replace_syntax

Дополните фрагмент кода, в котором объявляется функциональный интерфейс 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 сек.
Показать подсказку

3. Результат условия

id: 40516_func_03_predict_bool

Проанализируйте приведённый код на 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

id: 40516_func_04_error_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!");
    }
}
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

5. Лямбда для Consumer

id: 40516_func_05_select_lambda

В данном задании вам предстоит дополнить код, использующий функциональный интерфейс 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);
    }
}
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

6. Цепочка действий

id: 40516_func_06_build_chain

Из предложенных строк соберите корректную 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);
    }
}
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

7. Типы в лямбдах

id: 40516_func_07_highlight_types

В данном фрагменте кода 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);
Вызов метода
Имя интерфейса
Сообщения
Проверить
Показать подсказку
НайтиКурс.Ру