Optional.or() как запасной вариант
Цепочка запасных вариантов Optional без вложенных проверок.
Сравнение кода
✕ Java 8
Optional<Config> cfg = primary();
if (!cfg.isPresent()) {
cfg = secondary();
}
if (!cfg.isPresent()) {
cfg = defaults();
}
✓ Java 9+
Optional<Config> cfg = primary()
.or(this::secondary)
.or(this::defaults);
Заметили проблему в этом коде? Сообщите нам.
Почему современный подход лучше
Цепочный
Выстраивать запасные варианты в читаемый пайплайн.
Ленивое вычисление
Supplier запасного варианта выполняется только при необходимости.
Декларативный
Читается как 'попробуй основное, или вторичное, или по умолчанию'.
Старый подход
Вложенный запасной вариант
Современный подход
Цепочка .or()
Начиная с JDK
9
Сложность
Средний
Поддержка JDK
Optional.or() как запасной вариант
Доступно
Широко доступно с JDK 9 (сент. 2017)
Как это работает
Optional.or() возвращает исходный Optional, если он содержит значение, в противном случае вычисляет Supplier для получения альтернативного Optional. Supplier-ы ленивы — они вызываются только при необходимости.
Связанная документация
Доказательство