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