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

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

Ответ

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

Основное назначение: отложенная (ленивая) генерация или поставка значений.

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

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

    Supplier<String> uniqueIdSupplier = () -> UUID.randomUUID().toString();
    System.out.println(uniqueIdSupplier.get()); // Вызовет генерацию UUID
  2. Использование в Stream API и коллекторах:

    // Поставщик новой коллекции для Collectors.toCollection
    Supplier<ArrayList<String>> listSupplier = ArrayList::new;
    List<String> filteredList = someStream.collect(Collectors.toCollection(listSupplier));
  3. Реализация паттерна «Стратегия» или кэширования:

    Map<String, Supplier<Object>> strategyMap = new HashMap<>();
    strategyMap.put("A", () -> expensiveOperationA());
    strategyMap.put("B", () -> expensiveOperationB());
    
    // Операция выполнится только при вызове get()
    Object result = strategyMap.get(key).get();

Ключевые особенности:

  • Не имеет входных параметров.
  • Может выбрасывать проверяемые исключения (требует обработки внутри лямбды или обёртки).
  • Часто используется вместе с Optional.orElseGet(Supplier) для ленивого предоставления значения по умолчанию.
  • Является противоположностью Consumer<T>, который принимает значение, но ничего не возвращает.