Применение Optional в Java

Техноблог возвращается из стазиса. Теперь я верчусь в мире Java и заметки тоже будут про этот мир. Буду писать про всякие интересные штуки, которые обнаруживаю. Возможно, они миллион раз были где-то описаны, но мне это не важно, так как заметки скорее для себя, но может быть они ещё кому-то будут интересны.

Представим, что вам по цепочке вызовов нужно достать какое-то значение:

final Any thing = holder.getValue().getData().getObject().getAnythingElse();

При этом, в любом звене этой цепочки может вернуться null и случится аппокалипсис NullPointerException. Но он нам не нужен, а если вернулся null, нужно просто вернуть какое-нибудь дефолтное значение.

Можно обернуть всё это горой if-ов:

if(null != holder ) {
    if(null != holder.getValue()) {
        if(null != holder.getValue().getData()) {
            ...
        }
    }
}

Можно попробовать завернуть в try-catch (никогда так не делайте):

try {
    final Any thing = holder.getValue().getData().getObject().getAnythingElse();
} catch (NullPointerException e) {
    final Any thing = "Default Value";
}

Но красивым, и, на мой взгляд, лучшим решением будет использовать Optional:

final Any thing =
    Optional.ofNullable(holder)
        .map(Valuer::getValue)
        .map(Wrapper::getData)
        .map(Some::getObject)
        <...>
    .orElse("Default Value");

Каждый map проверит значение, возвращённое методом, на null и вернётся или нужное нам значение или заданное в блоке orElse.

Поделиться
Отправить
2018   java   фп
Популярное