Всем привет, продолжая идти по темам в закрепе, сегодня пара слов про Optional
1. orElse() против orElseGet()
Метод `orElse()` создает объект по умолчанию всегда, даже если значение внутри есть.
// someMethod() вызовется в любом случае
Optional.of("val").orElse(someMethod());
Используй orElseGet(() -> someMethod()). Он выполнит код только для пустой коробки.
2. Метод stream() (Java 9+)
Позволяет превратить список из `Optional` в обычный список без пустых значений одной строчкой:
List<User> users = listOfOptionals.stream()
.flatMap(Optional::stream)
.toList();
3. Цепочка поиска or() (Java 11)
Если первый источник данных вернул пустоту, пробуем второй:
findInCache().or(this::findInDb).or(this::defaultValue);
4. ifPresentOrElse()
Выполняет одно действие, если значение есть, и другое — если его нет:
optUser.ifPresentOrElse(
user -> System.out.println(user.getName()),
() -> System.out.println("Not found")
);
5. Главное правило: не клади Optional в поля класса
* Сериализация: Класс `Optional` не реализует интерфейс `Serializable`. Если сделать такое поле в объекте, приложение упадет при попытке отправить его через сеть или сохранить.
* Производительность: Создается лишний объект-обертка.
* Где использовать: Только как возвращаемый тип методов
(`Optional<User> findById(...)`).