{
    "version": "https:\/\/jsonfeed.org\/version\/1",
    "title": "Техноблог, заметки с тегом: фп",
    "home_page_url": "https:\/\/blog.toliklunev.ru\/tags\/fp\/",
    "feed_url": "https:\/\/blog.toliklunev.ru\/tags\/fp\/json\/",
    "icon": "https:\/\/blog.toliklunev.ru\/user\/userpic@2x.jpg",
    "author": {
        "name": "Анатолий Лунёв",
        "url": "https:\/\/blog.toliklunev.ru\/",
        "avatar": "https:\/\/blog.toliklunev.ru\/user\/userpic@2x.jpg"
    },
    "items": [
        {
            "id": "53",
            "url": "https:\/\/blog.toliklunev.ru\/all\/primenenie-optional-v-java\/",
            "title": "Применение Optional в Java",
            "content_html": "<p><i>Техноблог возвращается из стазиса. Теперь я верчусь в мире Java и заметки тоже будут про этот мир. Буду писать про всякие интересные штуки, которые обнаруживаю. Возможно, они миллион раз были где-то описаны, но мне это не важно, так как заметки скорее для себя, но может быть они ещё кому-то будут интересны.<\/i><\/p>\n<p>Представим, что вам по цепочке вызовов нужно достать какое-то значение:<\/p>\n<pre class=\"e2-text-code\"><code>final Any thing = holder.getValue().getData().getObject().getAnythingElse();<\/code><\/pre><p>При этом, в любом звене этой цепочки может вернуться null и случится <s>аппокалипсис<\/s> NullPointerException. Но он нам не нужен, а если вернулся null, нужно просто вернуть какое-нибудь дефолтное значение.<\/p>\n<p>Можно обернуть всё это горой if-ов:<\/p>\n<pre class=\"e2-text-code\"><code>if(null != holder ) {\r\n    if(null != holder.getValue()) {\r\n        if(null != holder.getValue().getData()) {\r\n            ...\r\n        }\r\n    }\r\n}<\/code><\/pre><p>Можно попробовать завернуть в try-catch (никогда так не делайте):<\/p>\n<pre class=\"e2-text-code\"><code>try {\r\n    final Any thing = holder.getValue().getData().getObject().getAnythingElse();\r\n} catch (NullPointerException e) {\r\n    final Any thing = &quot;Default Value&quot;;\r\n}<\/code><\/pre><p>Но красивым, и, на мой взгляд, лучшим решением будет использовать Optional:<\/p>\n<pre class=\"e2-text-code\"><code>final Any thing =\r\n    Optional.ofNullable(holder)\r\n        .map(Valuer::getValue)\r\n        .map(Wrapper::getData)\r\n        .map(Some::getObject)\r\n        &lt;...&gt;\r\n    .orElse(&quot;Default Value&quot;);<\/code><\/pre><p>Каждый map проверит значение, возвращённое методом, на null и вернётся или нужное нам значение или заданное в блоке orElse.<\/p>\n",
            "date_published": "2018-03-14T00:29:56+04:00",
            "date_modified": "2018-03-14T11:58:31+04:00",
            "_date_published_rfc2822": "Wed, 14 Mar 2018 00:29:56 +0400",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "53",
            "_e2_data": {
                "is_favourite": false,
                "links_required": [
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css",
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css",
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css",
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css"
                ],
                "og_images": []
            }
        }
    ],
    "_e2_version": 3254,
    "_e2_ua_string": "E2 (v3254; Aegea)"
}