Чем orElse отличается от orElseGet?
orElse(value) — аргумент вычисляется всегда, даже если значение есть (обычный порядок вычисления аргументов). orElseGet(supplier) — поставщик вызывается только при отсутствии.
- Константа — разницы нет
- Поход в базу или создание тяжёлого объекта — только orElseGet
- Побочный эффект в orElse выполнится всегда — коварная ошибка
А ещё orElseThrow(supplier) — тоже ленивый
Подробно
Это обычный порядок вычисления аргументов в Java: выражение считается до вызова метода. Пока альтернатива — константа, разницы нет, но если там поход в базу или создание тяжёлого объекта, вы платите за него на каждом вызове, включая случаи, когда значение присутствовало. Хуже того, побочные эффекты в таком выражении выполнятся всегда — источник неочевидных багов. Правило простое: константа или уже готовая ссылка — orElse; любое вычисление, обращение к внешней системе или создание объекта — orElseGet. Тот же принцип действует для orElseThrow, который принимает поставщика исключения именно поэтому: строить стектрейс на каждом успешном вызове не нужно.
Что хотят услышать
- Когда вычисляется аргумент.
- Практическое правило.
Частые ошибки
- Ставить в orElse вызов метода с побочным эффектом.
- Считать выбор между ними исключительно стилистическим.
Проверьте себя
Один верный вариант. Подумайте, потом откройте ответ.
Показать варианты и ответ
- ✗orElse работает только с примитивами, orElseGet — с объектами
- ✗Разницы нет, orElseGet добавлен для удобства записи
- ✗orElse бросает исключение при пустом Optional, а orElseGet — нет
- ✓Аргумент orElse вычисляется всегда, а поставщик orElseGet — только при пустом Optional
Что спросят дальше
- Почему orElseThrow принимает поставщика?
- Чем map отличается от flatMap у Optional?
Разбор темы
- Optional: явное отсутствие значения
Зачем Optional, orElse против orElseGet, композиция map/flatMap/filter и антипаттерны использования.
Связанные вопросы
Разбор собеседования с sotto
После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.