Разница между `Optional.orElse ()` и `Optional.orElseGet ()`

Я пытаюсь понять разницу междуOptional<T>.orElse() а такжеOptional<T>.orElseGet() методы.

Описание дляorElse() методMsgstr "Вернуть значение, если оно есть, в противном случае вернуть другое."

В то время как, описание дляorElseGet() методMsgstr "Вернуть значение, если оно есть, в противном случае вызвать другое и вернуть результат этого вызова."

orElseGet() Метод принимает функциональный интерфейс поставщика, который по существу не принимает никаких параметров и возвращаетT.

В какой ситуации вам нужно использоватьorElseGet()? Если у вас есть методT myDefault() почему бы тебе просто не сделатьoptional.orElse(myDefault()) скорее, чемoptional.orElseGet(() -> myDefault()) ?

Не похоже чтоorElseGet() откладывает выполнение лямбда-выражения на какое-то более позднее время или что-то подобное, так какой в ​​этом смысл? (Я бы подумал, что было бы более полезным, если бы он вернул более безопасныйOptional<T> чьяget() никогда не бросаетNoSuchElementException а такжеisPresent() всегда возвращает истину ... но, очевидно, это не так, он просто возвращаетT лайкorElse()).

Есть ли какая-то другая разница, по которой я скучаю?

Ответы на вопрос(6)

Ваш ответ на вопрос