Supplier и Consumer
Создавайте и обрабатывайте значения
«Supplier и Consumer» — бесплатный урок Java Academy на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Java Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Java Academy содержит 4 уроков всего.
Что делает поставщик значений
Supplier<T> не принимает аргументов и создаёт значение типа T.
- Его метод —
T get(). - Он отлично подходит для ленивого или отложенного создания значений.
import java.util.function.Supplier;
public class Main {
public static void main(String[] args) {
Supplier<String> greeting = () -> "Hello!";
System.out.println(greeting.get());
}
}Поставщики работают лениво
Код внутри Supplier выполняется только при вызове get. Поэтому поставщики идеально подходят для дорогостоящих значений по умолчанию, которые могут Вам не понадобиться.
import java.util.function.Supplier;
public class Main {
public static void main(String[] args) {
Supplier<Integer> expensive = () -> {
System.out.println("computing...");
return 42;
};
System.out.println("before get");
System.out.println(expensive.get());
}
}Поставщик для значений по умолчанию
Многие программные интерфейсы принимают Supplier, чтобы вычислять значение только при необходимости, например Optional.orElseGet.
import java.util.Optional;
public class Main {
public static void main(String[] args) {
Optional<String> name = Optional.empty();
System.out.println(name.orElseGet(() -> "default"));
}
}Что делает потребитель
Consumer<T> принимает значение и не возвращает ничего (void).
- Его метод —
void accept(T t). - Используется для побочных эффектов, например вывода на экран или ведения журнала.
import java.util.function.Consumer;
public class Main {
public static void main(String[] args) {
Consumer<String> printer = s -> System.out.println("Got: " + s);
printer.accept("data");
}
}Потребитель с forEach
Чаще всего с Consumer Вы встретитесь в Iterable.forEach и Stream.forEach.
import java.util.List;
public class Main {
public static void main(String[] args) {
List<String> items = List.of("a", "b", "c");
items.forEach(item -> System.out.println(item));
}
}Соединение потребителей с andThen
Consumer поддерживает andThen, который последовательно запускает двух потребителей для одних и тех же входных данных.
import java.util.function.Consumer;
public class Main {
public static void main(String[] args) {
Consumer<String> first = s -> System.out.println("upper: " + s.toUpperCase());
Consumer<String> second = s -> System.out.println("len: " + s.length());
first.andThen(second).accept("hello");
}
}BiConsumer для двух входных значений
BiConsumer<T, U> принимает два аргумента и ничего не возвращает. Map.forEach использует его для перебора пар ключей и значений.
import java.util.Map;
public class Main {
public static void main(String[] args) {
Map<String, Integer> ages = Map.of("Ann", 30, "Bob", 25);
ages.forEach((name, age) -> System.out.println(name + "=" + age));
}
}Ссылки на методы как потребители
Ссылка на метод, например System.out::println, — это удобный Consumer.
import java.util.List;
public class Main {
public static void main(String[] args) {
List<Integer> nums = List.of(1, 2, 3);
nums.forEach(System.out::println);
}
}Сочетание поставщика и потребителя
Supplier может напрямую передать созданное значение Consumer, образуя простой поток «создать, затем обработать».
import java.util.function.Supplier;
import java.util.function.Consumer;
public class Main {
public static void main(String[] args) {
Supplier<String> source = () -> "payload";
Consumer<String> sink = s -> System.out.println("received " + s);
sink.accept(source.get());
}
}Поставщики, возвращающие объекты
Конструкторы естественным образом выступают в роли поставщиков через ClassName::new, если аргументы не требуются.
import java.util.ArrayList;
import java.util.List;
import java.util.function.Supplier;
public class Main {
public static void main(String[] args) {
Supplier<List<String>> factory = ArrayList::new;
List<String> list = factory.get();
list.add("x");
System.out.println(list);
}
}Побочные эффекты и чистые функции
Запомните различие:
Supplier: не принимает входных данных, создаёт результат.Consumer: принимает входные данные и не создаёт результата (побочный эффект).Function: принимает входные данные и возвращает результат.
import java.util.function.Supplier;
import java.util.function.Consumer;
public class Main {
public static void main(String[] args) {
Supplier<Integer> dice = () -> 4;
Consumer<Integer> show = n -> System.out.println("rolled " + n);
show.accept(dice.get());
}
}Быстрая проверка
Какой функциональный интерфейс не принимает аргументов и возвращает значение?
Повторение
Вы функционально создавали значения и обрабатывали их:
Supplier<T>используетget()для ленивого создания значений.Consumer<T>используетaccept()для побочных эффектов и объединяет вызовы с помощьюandThen.BiConsumer<T,U>обрабатывает два входных значения, как вMap.forEach.- Ссылки на методы и конструкторы делают оба варианта лаконичными.
Часто задаваемые вопросы
Урок «Supplier и Consumer» бесплатный?
Да — полный текст урока «Supplier и Consumer» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Java Academy, подпишись на CoddyKit PRO. Курс Java Academy содержит 4 уроков всего.
Чему я научусь в уроке «Supplier и Consumer»?
Создавайте и обрабатывайте значения Ты практикуешь Java Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Java Academy?
Предыдущий опыт не требуется. Java Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.
Сколько времени занимает урок «Supplier и Consumer»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Java Academy?
Да. Каждый урок Java Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Function и BiFunction
- Supplier и Consumer
- Predicate и композиция
- Пользовательские функциональные интерфейсы