<?xml version="1.0" encoding="utf-8"?> 
<rss version="2.0">

<channel>

<title>Техноблог, заметки с тегом: фп</title>
<link>https://blog.toliklunev.ru/tags/fp/</link>
<description></description>
<generator>E2 (v3254; Aegea)</generator>

<item>
<title>Применение Optional в Java</title>
<guid isPermaLink="false">53</guid>
<link>https://blog.toliklunev.ru/all/primenenie-optional-v-java/</link>
<comments>https://blog.toliklunev.ru/all/primenenie-optional-v-java/</comments>
<description>&lt;p&gt;&lt;i&gt;Техноблог возвращается из стазиса. Теперь я верчусь в мире Java и заметки тоже будут про этот мир. Буду писать про всякие интересные штуки, которые обнаруживаю. Возможно, они миллион раз были где-то описаны, но мне это не важно, так как заметки скорее для себя, но может быть они ещё кому-то будут интересны.&lt;/i&gt;&lt;/p&gt;
&lt;p&gt;Представим, что вам по цепочке вызовов нужно достать какое-то значение:&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code&gt;final Any thing = holder.getValue().getData().getObject().getAnythingElse();&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;При этом, в любом звене этой цепочки может вернуться null и случится &lt;s&gt;аппокалипсис&lt;/s&gt; NullPointerException. Но он нам не нужен, а если вернулся null, нужно просто вернуть какое-нибудь дефолтное значение.&lt;/p&gt;
&lt;p&gt;Можно обернуть всё это горой if-ов:&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code&gt;if(null != holder ) {
    if(null != holder.getValue()) {
        if(null != holder.getValue().getData()) {
            ...
        }
    }
}&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Можно попробовать завернуть в try-catch (никогда так не делайте):&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code&gt;try {
    final Any thing = holder.getValue().getData().getObject().getAnythingElse();
} catch (NullPointerException e) {
    final Any thing = &amp;quot;Default Value&amp;quot;;
}&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Но красивым, и, на мой взгляд, лучшим решением будет использовать Optional:&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code&gt;final Any thing =
    Optional.ofNullable(holder)
        .map(Valuer::getValue)
        .map(Wrapper::getData)
        .map(Some::getObject)
        &amp;lt;...&amp;gt;
    .orElse(&amp;quot;Default Value&amp;quot;);&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Каждый map проверит значение, возвращённое методом, на null и вернётся или нужное нам значение или заданное в блоке orElse.&lt;/p&gt;
</description>
<pubDate>Wed, 14 Mar 2018 00:29:56 +0400</pubDate>
</item>


</channel>
</rss>