How to use Java Optional to elegantly replace Ternary operators
You're looking for .orElseGet(() -> recordB.get().getCreatedAt());
and the reason to that can be found on this post --> Difference between Optional.orElse()
and Optional.orElseGet()
Some people may find it a bit subjective but personally, I'd say by default, it makes more sense to use orElseGet()
as opposed to orElse
every time except in the case where the default object is already constructed as this will prevent many unexpected problems (given you didn't read the differences between orElse and orElseGet doc) as such of the one you're facing now.
read more from Java Optional – orElse() vs orElseGet()
To avoid eagerly evaluating else-branches, use orElseGet
, which takes an instance of the functional interface Supplier
:
return recordA.map(
record -> record.getCreatedAt())
.orElseGet(() -> recordB.get().getCreatedAt());
My question about recordB
being Optional
got unanswered but if it is Optional
then you cannot just safely call its get
method, you need to check if it is empty or not. Here safe call to get record or null if both recordA
and recordB
are empty Otional
s.
recordA
.map(Record::getCreatedAt)
.orElseGet( () -> recordB.map(Record::getCreatedAt).orElse(null) );