Как работает метод map() у Optional в Java?

«Как работает метод map() у Optional в Java?» — вопрос из категории Java Core, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Метод Optional.map() преобразует значение внутри Optional, если оно присутствует. Он применяет переданную функцию-маппер и возвращает новый Optional, обертывающий результат. Если исходный Optional пуст, маппер не вызывается, и возвращается Optional.empty().

Сигнатура: <U> Optional<U> map(Function<? super T, ? extends U> mapper)

Примеры:

// 1. Преобразование непустого Optional
Optional<String> nonEmptyOpt = Optional.of("hello");
Optional<Integer> lengthOpt = nonEmptyOpt.map(String::length); // Optional[5]

// 2. Работа с пустым Optional (маппер не вызывается)
Optional<String> emptyOpt = Optional.empty();
Optional<Integer> result = emptyOpt.map(String::length); // Optional.empty

// 3. Цепочка преобразований
Optional<String> userInput = Optional.of(" 123 ");
Optional<Integer> parsedNumber = userInput
    .map(String::trim)      // Optional["123"]
    .map(Integer::parseInt); // Optional[123]

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

  1. Безопасность от NPE: Если функция-маппер возвращает null, метод map() автоматически преобразует это в Optional.empty().
  2. Не меняет исходный объект: Optional иммутабелен, map() всегда возвращает новый объект.
  3. Отличие от flatMap(): map() ожидает функцию, возвращающую обычное значение (которое будет обернуто). flatMap() ожидает функцию, возвращающую уже готовый Optional (чтобы избежать вложенности Optional<Optional<T>>).

Когда использовать: Для последовательных, безопасных преобразований значения внутри Optional без необходимости проверять isPresent().