Ответ
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(); // Получает значение
Ключевое отличие
Consumer—void accept(T): Принимает данные для обработки.Supplier—T 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() — это поставщик, он тебе что-то выдает из своего потаённого места. И всё, больше нихуя не перепутаешь.