Search code examples
javajava-8refactoringoption-type

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?


Solution

  • 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.