В чем разница между интерфейсами Consumer и Supplier в Java?

«В чем разница между интерфейсами Consumer и Supplier в Java?» — вопрос из категории Основы программирования, который задают на 10% собеседований QA Тестировщик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Consumer<T> и Supplier<T> — это функциональные интерфейсы из пакета java.util.function, представляющие два противоположных паттерна.

Consumer (Потребитель)

  • Сигнатура: void accept(T t)
  • Назначение: Выполняет операцию над переданным объектом, не возвращая результат. Используется для модификации или потребления данных.
  • Пример: Вывод строки в консоль.
    Consumer<String> printer = s -> System.out.println(s);
    printer.accept("Hello, World!"); // Выполняет действие

Supplier (Поставщик)

  • Сигнатура: T get()
  • Назначение: Не принимает аргументов, но возвращает объект типа T. Используется для ленивой генерации или предоставления значений.
  • Пример: Генерация текущей даты.
    Supplier<LocalDate> todaySupplier = () -> LocalDate.now();
    LocalDate today = todaySupplier.get(); // Получает значение

Ключевое отличие

  • Consumervoid accept(T): Принимает данные для обработки.
  • SupplierT get(): Предоставляет данные.