Optional.map() и методами, возвращающими OptionalМногие Java-разработчики на автомате пишут что-то вроде:
Optional<User> user = findUserById(id); // возвращает Optional<User>
Optional<String> email = user.map(User::getEmail); // getEmail тоже возвращает Optional<String>
⚠️ Проблема:
map() в Optional не "разворачивает" вложенные Optional. В этом примере email будет типа Optional<Optional<String>>, что почти всегда нежелательно.📌 Правильный способ — использовать
flatMap():
Optional<String> email = user.flatMap(User::getEmail);
💡
flatMap() позволяет избежать "двойной обёртки", если метод внутри map() уже возвращает Optional.🔁 Аналогичная ситуация с
Stream.map() — если внутри map() вызывается метод, возвращающий Stream, то получится Stream<Stream<T>>, и опять же нужно использовать flatMap().🧪 Мини-памятка:
*
map() — когда метод возвращает обычный тип (T → R);*
flatMap() — когда метод возвращает Optional или Stream (T → Optional<R> или T → Stream<R>).📲 Мы в MAX
👉@BookJava


