0Pricing
Java Academy · Урок

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 — локальная установка не требуется.

Все уроки этого курса

  1. Function и BiFunction
  2. Supplier и Consumer
  3. Predicate и композиция
  4. Пользовательские функциональные интерфейсы
← Назад к Java Academy