Я пытаюсь понять разницу между методами Optional<T>.orElse()
и Optional<T>.orElseGet()
.
Описание метода orElse()
: "Вернуть значение, если оно присутствует, иначе вернуть другое".
В то время как описание метода orElseGet()
- "Возвратить значение, если оно присутствует, иначе вызвать другое и вернуть результат этого вызова".
Метод orElseGet()
использует функциональный интерфейс поставщика, который по существу не принимает никаких параметров и возвращает T
.
В какой ситуации вам понадобится использовать orElseGet()
? Если у вас есть метод T myDefault()
, почему бы вам просто не сделать optional.orElse(myDefault())
, а не optional.orElseGet(() -> myDefault())
?
Кажется, что orElseGet()
откладывает выполнение выражения лямбды до какого-то более позднего времени или что-то в этом роде, и что это за точка? (Я бы подумал, что было бы более полезно, если бы он вернул более безопасный Optional<T>
, который get()
никогда не выбрасывает NoSuchElementException
и isPresent()
всегда возвращает true... но, очевидно, его нет, он просто возвращает T
например orElse()
).
Есть ли какая-то другая разница, которую мне не хватает?