I have several ways of calculating a value, in decreasing preference.
firstWay()
second() + way()
orA(thirdWay())
Each of these returns an Option
. I want to "coalesce" these and get an Option
which the the value returned by the first Some
of these, or None
if all returned None
.
Of course, if firstWay()
returns a Some
, I shouldn't calculate the rest.
What is the most idiomatic (or at least reasonably readable) way to do this?
firstWay().orElse(second() + way()).orElse(orA(thirdWay()))
orElse
's argument is lazily evaluated.
See the documentation.
If you have enough ways that Karol's answer becomes unwieldy, or don't know in advance how many:
val options: Stream[Option[A]] = ...
// in the example: firstWay() #:: (second() + way()) #:: orA(thirdWay())
options.foldLeft[Option[A]](None)(_.orElse(_))
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With