Для чего используется функциональный интерфейс Supplier в Java?

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

Ответ

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

Основные сценарии применения:

  1. Ленивая (отложенная) инициализация: Создание ресурсоемкого объекта только в момент вызова get().

    Supplier<ExpensiveObject> supplier = () -> new ExpensiveObject();
    // Объект еще не создан
    ExpensiveObject obj = supplier.get(); // Создание происходит здесь
  2. Генерация или предоставление значений: Например, поставка конфигурации, случайных данных или уникальных идентификаторов.

    Supplier<String> uuidSupplier = () -> UUID.randomUUID().toString();
    Supplier<Double> randomSupplier = Math::random;
  3. Интеграция со Stream API: Для создания бесконечных потоков данных с помощью Stream.generate().

    Stream.generate(() -> "data").limit(5).forEach(System.out::println);
  4. Работа с Optional: Предоставление значения по умолчанию ленивым способом через Optional.orElseGet().

    String value = optionalString.orElseGet(() -> fetchDefaultValue());

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