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

Ответ

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(): Предоставляет данные.

Ответ 18+ 🔞

Давай разберём эту парочку, а то они как Инь и Янь в мире джавы, только без всякой этой философии, на чистом практическом пиздеце.

Вот смотри, представь себе кухню. Есть Повар-Поставщик (Supplier<T>). Его работа — стоять на своём месте и выдавать готовые блюда. Ты к нему подходишь, говоришь «Дай!», а он тебе — раз! — и котлету в руки. Ничего у него не просишь, он сам всё знает. Его метод — get(). Без аргументов, просто даёт.

Supplier<String> повар = () -> "Сочная котлета";
String еда = повар.get(); // Взял и получил. Всё.

А теперь есть Обжора-Потребитель (Consumer<T>). Это тот, кто приходит с этой котлетой. Его задача — её сожрать. Ты ему в руки суёшь объект (ту самую котлету), а он делает с ним что положено: жрёт, хвалит, чавкает. Ничего он тебе не возвращает, только действие. Его метод — accept(T t). Он принимает и потребляет.

Consumer<String> обжора = котлета -> System.out.println("Съел " + котлета + " и доволен.");
обжора.accept(еда); // Отдал ему котлету, он её обработал.

Короче, суть проста до безобразия:

  • Supplier — это «Дай!». Ничего не вводишь, получаешь результат. Как халявный генератор.
  • Consumer — это «На!». Вводишь что-то, а обратно — тишина, только щелчок операции. Как чёрная дыра для данных.

Их, блядь, часто вместе используют в пайплайнах. Один (Supplier) по конвейеру начинает кидать кирпичи, а другой (Consumer) в конце ловит их и, например, в стену закладывает. А между ними ещё Function или Predicate могут быть, которые эти кирпичи красят или отбраковывают. Ёперный театр, а не программирование!

Запомни так: если видишь void accept(T t) — это потребитель, он жрёт твой аргумент. Видишь T get() — это поставщик, он тебе что-то выдает из своего потаённого места. И всё, больше нихуя не перепутаешь.