Что представляет собой функциональный интерфейс Supplier в Java?

«Что представляет собой функциональный интерфейс Supplier в Java?» — вопрос из категории Java Core, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Supplier<T> — это функциональный интерфейс из пакета java.util.function, который представляет поставщика (генератора) результатов. Он не принимает аргументов, но возвращает значение типа T.

Сигнатура:

@FunctionalInterface
public interface Supplier<T> {
    T get(); // Единственный абстрактный метод
}

Основное назначение:

  1. Ленивая генерация или поставка значений.
  2. Отложенное выполнение (deferred execution).

Типичные примеры использования:

1. Ленивая инициализация или генерация данных:

Supplier<String> randomIdSupplier = () -> UUID.randomUUID().toString();
System.out.println(randomIdSupplier.get()); // e.g., "f81d4fae-7dec-11d0-a765-00a0c91e6bf6"

Supplier<Double> randomSupplier = Math::random;
System.out.println(randomSupplier.get()); // Случайное число от 0.0 до 1.0

2. Использование с Optional для безопасного получения значения:

Optional<String> optional = Optional.empty();
// orElseGet принимает Supplier
String value = optional.orElseGet(() -> "Default Value from Supplier");
System.out.println(value); // "Default Value from Supplier"

3. Использование в Stream API для генерации бесконечных потоков:

// Генерация потока из 5 случайных чисел
Supplier<Double> supplier = Math::random;
List<Double> randoms = Stream.generate(supplier)
                             .limit(5)
                             .collect(Collectors.toList());

4. Инкапсуляция логики создания объектов (фабрика):

Supplier<LocalDateTime> currentTimeSupplier = LocalDateTime::now;
Supplier<Connection> connectionSupplier = () -> DriverManager.getConnection(URL);

Ключевая идея: Supplier позволяет инкапсулировать и передавать алгоритм получения значения как объект, что обеспечивает гибкость и поддержку отложенных вычислений.