Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Optional get value if present

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 :)

like image 897
Tobias Hahn Avatar asked Dec 15 '17 14:12

Tobias Hahn


People also ask

What is Optional <> in Java?

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.

What does ifPresent do in Java?

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.


2 Answers

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
}
like image 135
fps Avatar answered Sep 30 '22 11:09

fps


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;
like image 37
daniu Avatar answered Sep 30 '22 09:09

daniu