Вопрос проверяет понимание функционального подхода к работе с Optional в Java и умение применять метод map для безопасного преобразования значения.
Класс Optional в Java представляет собой контейнер, который может содержать или не содержать ненулевое значение. Его основная цель — предоставить более ясный и безопасный способ работы с потенциально отсутствующими значениями, заменяя проверки на null. Метод map является ключевым функциональным методом в этом API.
Метод map принимает функцию (Function<T, U>) в качестве аргумента. Логика его работы следующая:
Optional содержит значение (т.е. isPresent() возвращает true), то к этому значению применяется переданная функция. Результат функции заворачивается в новый Optional (который может быть пустым, если функция возвращает null).Optional пуст (т.е. isPresent() возвращает false), то map немедленно возвращает пустой Optional без вызова функции.Рассмотрим практический пример, где у нас есть Optional строки, и мы хотим преобразовать её в целое число.
import java.util.Optional;
public class OptionalMapExample {
public static void main(String[] args) {
// Пример с присутствующим значением
Optional<String> optionalString = Optional.of("42");
Optional<Integer> optionalInt = optionalString.map(Integer::parseInt);
System.out.println(optionalInt); // Вывод: Optional[42]
// Пример с пустым Optional
Optional<String> emptyOptional = Optional.empty();
Optional<Integer> result = emptyOptional.map(Integer::parseInt);
System.out.println(result); // Вывод: Optional.empty
// Функция parseInt не вызывается, исключения не возникает.
// Пример цепочки преобразований
Optional<String> input = Optional.of(" hello ");
Optional<String> trimmedAndUpper = input
.map(String::trim)
.map(String::toUpperCase);
System.out.println(trimmedAndUpper); // Вывод: Optional[HELLO]
}
}Метод map особенно полезен в сценариях, где нужно выполнить серию преобразований над значением, которое может отсутствовать. Это часто встречается при:
null.Вывод: Используйте метод map для Optional, когда вам нужно безопасно преобразовать значение внутри контейнера, не беспокоясь о проверках на null и не прерывая цепочку вычислений в случае его отсутствия.