How to avoid using Optional.get and Optional.isPresent

半腔热情 提交于 2020-01-13 02:14:22

问题


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?


回答1:


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.




回答2:


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



来源:https://stackoverflow.com/questions/43202596/how-to-avoid-using-optional-get-and-optional-ispresent

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!