Применение 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.