As an example I have an optional like this:
Optional<Desktop> opt = Optional.ofNullable(status).map(Status::getDesktop);
I want to have the desktop and work with it outside of lambda expressions. I do it like this:
if (opt.isPresent()){
Desktop desktop = opt.get();
...
}
Is there a better solution to get the desktop; something like this ?
Desktop desktop = Optional.ofNullable(status).map(Status::getDesktop).ifPresent(get());
EDIT: OrElse was the method I was looking for :)
Optional is a container object used to contain not-null objects. Optional object is used to represent null with absent value. This class has various utility methods to facilitate code to handle values as 'available' or 'not available' instead of checking null values.
The ifPresent method of the Optional class is an instance method that performs an action if the class instance contains a value. This method takes in the Consumer interface's implementation whose accept method will be called with the value of the optional instance as the parameter to the accept method.
If you have a default value for your Desktop
, you could try with Optional.orElse
:
Desktop defaultDesktop = ...;
Desktop desktop = Optional.ofNullable(status)
.map(Status::getDesktop)
.orElse(defaultDesktop);
However, you don't have to necessarily work inside a lambda expression with Optional.ifPresent
. You could perfectly use a method that receives a Desktop
instance, which would act as the Consumer
argument of Optional.ifPresent
:
Desktop desktop = Optional.ofNullable(status)
.map(Status::getDesktop)
.ifPresent(this::workWithDesktop);
Then:
void workWithDesktop(Desktop desktop) {
// do whatever you need to do with your desktop
}
If you need additional arguments (apart from the desktop itself), you could use a lambda expression that invokes the method instead:
String arg1 = "hello";
int arg2 = 10;
Desktop desktop = Optional.ofNullable(status)
.map(Status::getDesktop)
.ifPresent(desktop -> this.workWithDesktop(desktop, arg1, arg2));
And then:
void workWithDesktop(Desktop desktop, String arg1, int arg2) {
// do whatever you need to do with your desktop, arg1 and arg2
}
I was told here just last week that it's a code smell to even use Optional like this at all, so
Desktop desktop = (status != null)? status.getDesktop() : null;
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