Я пытаюсь понять разницу между методами 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()).
Есть ли какая-то другая разница, которую мне не хватает?