Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to avoid using Optional.get and Optional.isPresent

public ValueA map(ValueB valueB, Date date) {
    Optional<ValueC> valueCOpt = find(valueB);
    if (valueCOpt.isPresent()) {
        ValueC valueC = valueCOpt.get();
        // call many getters on valueC and do a lot of logic with it.
        return map(/*some parameters*/);
    }
    return null;
}

This seems quite ugly. The advantage of optionals is completely gone in here. I read that one should rather use map or flatMap instead of get. But is it really a benefit if I replace every getter like

valueC.getFieldA()

with

valueCOpt.map(ValueC::getFieldA)

Do you know some common or best practices here?

like image 954
Chris311 Avatar asked Apr 04 '17 08:04

Chris311


People also ask

What exception is thrown by optional get () when not nested within optional isPresent?

Simply put, if the value is present, then isPresent() would return true, and calling get() will return this value. Otherwise, it throws NoSuchElementException.

How do I use optional to avoid NULL pointer?

An empty optional is the main way to avoid the Null Pointer Exception when using the Optional API. In Optional 's flow, a null will be transformed into an empty Optional . The empty Optional won't be processed any further. This is how we can avoid a NullPointerException when using Optional .

How do I make optional isPresent false?

If you just want an Optional returning false for isPresent() , you don't need to mock the Optional at all but just create an empty one. Of course this test only tests that the mock object actually returns the stubbed return value, but you get the idea.

Why is null better than optional?

In a nutshell, the Optional class includes methods to explicitly deal with the cases where a value is present or absent. However, the advantage compared to null references is that the Optional class forces you to think about the case when the value is not present.


2 Answers

You can use

public ValueA map(ValueB valueB, Date date) {
    return find(valueB)
        .map(valueC -> {
            // call many getters on valueC and do a lot of logic with it.
            return map(/*some parameters*/);
        })
        .orElse(null);
}

the key point is that the mapping function is only evaluated, if the optional is not empty, otherwise, the result stays an empty optional. orElse(null) will return null if the optional is empty.

like image 137
Holger Avatar answered Oct 20 '22 15:10

Holger


What you need is to map, then a orElse(), or orElseThrow() if you need an exception

ValueA valueA = valueCOpt.map(valueC -> mapToValue(valueC))
       .orElse(null);

orElse() is used when you need a default value, in this case its null

like image 41
Ash Avatar answered Oct 20 '22 14:10

Ash