Ответ
Метод 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]
Ключевые особенности:
- Безопасность от NPE: Если функция-маппер возвращает
null, методmap()автоматически преобразует это вOptional.empty(). - Не меняет исходный объект:
Optionalиммутабелен,map()всегда возвращает новый объект. - Отличие от flatMap():
map()ожидает функцию, возвращающую обычное значение (которое будет обернуто).flatMap()ожидает функцию, возвращающую уже готовыйOptional(чтобы избежать вложенностиOptional<Optional<T>>).
Когда использовать: Для последовательных, безопасных преобразований значения внутри Optional без необходимости проверять isPresent().