Ответ
Supplier<T> — это функциональный интерфейс из пакета java.util.function, который представляет поставщика (генератора) результатов. Он не принимает аргументов, но возвращает значение типа T.
Сигнатура:
@FunctionalInterface
public interface Supplier<T> {
T get(); // Единственный абстрактный метод
}
Основное назначение:
- Ленивая генерация или поставка значений.
- Отложенное выполнение (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 позволяет инкапсулировать и передавать алгоритм получения значения как объект, что обеспечивает гибкость и поддержку отложенных вычислений.