{"id":100,"date":"2017-11-14T19:23:12","date_gmt":"2017-11-14T18:23:12","guid":{"rendered":""},"modified":"2018-09-17T21:51:07","modified_gmt":"2018-09-17T19:51:07","slug":"java-8-optional","status":"publish","type":"post","link":"https:\/\/spireng.sk\/en\/java-8-optional\/","title":{"rendered":"Java 8 \u2013 Optional"},"content":{"rendered":"<p class=\"Standard\" style=\"text-align: justify; text-justify: inter-ideograph;\"><img loading=\"lazy\" decoding=\"async\" class=\"imgp_img\" style=\"float: left; margin: 2px 5px;\" src=\"\/sites\/default\/files\/imagepicker\/1\/cxz687gf.png\" alt=\"Obr\u00e1zok\" width=\"200\" height=\"214\" \/>U\u017e to tak bude, \u017ee v ka\u017edom programovacom jazyku (a Java nie je v\u00fdnimkou) potrebujete raz za \u010das rie\u0161i\u0165 jeden probl\u00e9m. Ten probl\u00e9m je, \u017ee m\u00e1te met\u00f3du, ktor\u00e1 vracia nejak\u00fd v\u00fdsledok (presnej\u0161ie objekt alebo e\u0161te presnej\u0161ie jeho referenciu), ale m\u00f4\u017ee sa vyskytn\u00fa\u0165 leg\u00e1lny pr\u00edpad, kedy met\u00f3da nevr\u00e1ti ni\u010d. V takom pr\u00edpade sa naj\u010dastej\u0161ie siaha po rie\u0161en\u00ed, \u017ee met\u00f3da vr\u00e1ti hodnotu null. A to je rie\u0161enie, ktor\u00e9 vie prinies\u0165 viac probl\u00e9mov ako \u00fa\u017eitku. Volaj\u00faci k\u00f3d toti\u017e s nie\u010d\u00edm tak\u00fdm jednoducho nemus\u00ed po\u010d\u00edta\u0165 a v\u00fdsledok je zn\u00e1ma <em style=\"mso-bidi-font-style: normal;\">NullPointerException<\/em>. Tento probl\u00e9m je tu s nami u\u017e nejak\u00fd \u010das a r\u00f4zne jazyky (a Java nie je v\u00fdnimkou) sa s n\u00edm sna\u017eia r\u00f4zne vysporiada\u0165. Dnes n\u00e1\u0161 seri\u00e1l o Jave 8 bude o novom type <em style=\"mso-bidi-font-style: normal;\">Optional<\/em>.<!--more--><!--break--><\/p>\n<p class=\"Standard\" style=\"text-align: justify; text-justify: inter-ideograph;\">Probl\u00e9m, ktor\u00fd som pop\u00edsal v\u00a0\u00favode, sa sna\u017e\u00ed napr. <em style=\"mso-bidi-font-style: normal;\">Groovy<\/em> rie\u0161i\u0165 pomocou <em style=\"mso-bidi-font-style: normal;\">Null-Safe Dereference<\/em> oper\u00e1tora. M\u00f4\u017eem to vyzera\u0165 napr\u00edklad takto:<\/p>\n<pre class=\"Standard\">String version = computer?.getSoundcard()?.getUSB()?.getVersion();<\/pre>\n<p class=\"Standard\" style=\"text-align: justify; text-justify: inter-ideograph;\"><em style=\"mso-bidi-font-style: normal;\">getSoundcard<\/em> bude volan\u00e9, ak computer nieje null. <em style=\"mso-bidi-font-style: normal;\">getUSB<\/em> bude volan\u00e9, len ak <em style=\"mso-bidi-font-style: normal;\">getSoundcard<\/em> nevr\u00e1ti null at\u010f. Rovnak\u00fa syntax pou\u017e\u00edva tie\u017e C#. <em style=\"mso-bidi-font-style: normal;\">Haskell<\/em> m\u00e1 na tento probl\u00e9m typ Maybe, Scala typ <em style=\"mso-bidi-font-style: normal;\">Optional[T]<\/em> a Java? Java mala dlho kni\u017enicu <em style=\"mso-bidi-font-style: normal;\">Guava<\/em>, ktor\u00e1 <em style=\"mso-bidi-font-style: normal;\">Optional<\/em> obsahovala. Od verzie 8 je u\u017e s\u00fa\u010das\u0165ou jej samotnej.<\/p>\n<p class=\"Standard\" style=\"text-align: justify; text-justify: inter-ideograph;\">\u010co to <em style=\"mso-bidi-font-style: normal;\">Optional<\/em> vlastne je? Je to typov\u00fd kontajner, ktor\u00fd m\u00f4\u017ee alebo nemus\u00ed obsahova\u0165 referenciu na objekt. Jeho pou\u017eite je pomerne jednoduch\u00e9 a najlep\u0161ie sa demon\u0161truje na n\u00e1vratovej hodnote nejakej met\u00f3dy. T\u00e1 nevr\u00e1ti samotn\u00fd objekt, ale objekt <em style=\"mso-bidi-font-style: normal;\">Optional<\/em>. Napr\u00edklad:<\/p>\n<pre class=\"Standard\" style=\"padding-left: 30px;\">Optional&lt;Car&gt; methodResult = getCarObject();<\/pre>\n<p class=\"Standard\" style=\"text-align: justify; text-justify: inter-ideograph;\">S kontajnerom <em style=\"mso-bidi-font-style: normal;\">Optional<\/em> viem n\u00e1sledne pracova\u0165. Napr\u00edklad zisti\u0165, \u010di nie\u010do obsahuje:<\/p>\n<pre class=\"Standard\" style=\"padding-left: 30px;\">methodResult.isPresent();<\/pre>\n<p class=\"Standard\" style=\"text-align: justify; text-justify: inter-ideograph;\">Alebo vytiahnu\u0165 z neho objekt:<\/p>\n<pre class=\"Standard\" style=\"padding-left: 30px;\">methodResult.get();<\/pre>\n<p class=\"Standard\" style=\"text-align: justify; text-justify: inter-ideograph;\">To samozrejme nie je v\u0161etko. API objektu obsahuje met\u00f3dy, ktor\u00e9 u\u013eah\u010duj\u00fa pr\u00e1cu s n\u00edm na z\u00e1klade toho, \u010di nejak\u00fd objekt obsahuje alebo nie. Napr\u00edklad zavola\u0165 funkciu, ak nie\u010do obsahuje:<\/p>\n<pre class=\"Standard\" style=\"padding-left: 30px;\">methodResult.isPresent(System.out::println);<\/pre>\n<p class=\"Standard\" style=\"text-align: justify; text-justify: inter-ideograph;\">Alebo vr\u00e1ti\u0165 nejak\u00fd default objekt, ak je naopak kontajner pr\u00e1zdny:<\/p>\n<pre class=\"Standard\" style=\"padding-left: 30px;\">methodResult.orElse(new Car());<\/pre>\n<p class=\"Standard\" style=\"text-align: justify; text-justify: inter-ideograph;\">A \u010do tak vyhodi\u0165 v\u00fdnimku, ak je pr\u00e1zdny:<\/p>\n<pre class=\"Standard\" style=\"padding-left: 30px;\">methodResult.orElseThrow(IllegalStateException::new);<\/pre>\n<p class=\"Standard\" style=\"text-align: justify; text-justify: inter-ideograph;\"><em style=\"mso-bidi-font-style: normal;\">Optional<\/em> API m\u00e1 v sebe dokonca nieko\u013eko met\u00f3d, ktor\u00e9 s\u00fa prebrat\u00e9 z API streamov. Napr\u00edklad:<\/p>\n<pre class=\"Standard\" style=\"padding-left: 30px;\">methodResult.map(String::trim)\r\n<span style=\"mso-tab-count: 2;\">\u00a0\u00a0\u00a0\u00a0\u00a0 <\/span>.filter(t -&gt; t.length() &gt; 1)\r\n<span style=\"mso-spacerun: yes;\">\u00a0\u00a0\u00a0\u00a0\u00a0 <\/span>.ifPresent(System.out::println);<\/pre>\n<p>Cel\u00e9 to funguje tak, \u017ee ak <em style=\"mso-bidi-font-style: normal;\">Optional<\/em> obsahuje nejak\u00fa hodnotu, tak sa na \u0148u aplikuje postupne <em style=\"mso-bidi-font-style: normal;\">map<\/em> a n\u00e1sledne <em style=\"mso-bidi-font-style: normal;\">filter<\/em> oper\u00e1cia. V\u00fdsledkom filter oper\u00e1cie je, \u017ee bu\u010f <em style=\"mso-bidi-font-style: normal;\">Optional<\/em> ostane nejakou hodnotou naplnen\u00fd (ak vyhovuje filtru) alebo nie. Na z\u00e1ver, ak v \u0148om e\u0161te st\u00e1le je nejak\u00e1 hodnota, vytla\u010d\u00ed sa obsah do konzoly.<\/p>\n<p>Na\u00a0<em>Optional<\/em> sa d\u00e1 pozera\u0165 ako na \u0161ikovn\u00fa krabi\u010dku, v ktorej si viete pren\u00e1\u0161a\u0165 nejak\u00fd odkaz a je to vo viacer\u00fdch oh\u013eadoch praktickej\u0161ie ako ke\u010f pou\u017e\u00edte priamo ten odkaz. Neznamen\u00e1 to, \u017ee teraz by v\u0161etky va\u0161e met\u00f3dy mali vraca\u0165 u\u017e len\u00a0<em>Optional<\/em>. To ani je je ofici\u00e1lne odpor\u00fa\u010danie. Je dobr\u00e9 to ale pou\u017e\u00edva\u0165 v public API, kde chcete tomu, \u010do v\u00e1\u0161 k\u00f3d bude vola\u0165, jasne nazna\u010di\u0165, \u017ee mo\u017eno mu ni\u010d nevr\u00e1tite. Ak u\u017e mu toti\u017e met\u00f3da raz vracia tak\u00fdto objekt, ned\u00e1 sa tak \u013eahko ignorova\u0165 ako oby\u010dajna pozn\u00e1mka v dokument\u00e1cii, \u017ee met\u00f3da m\u00f4\u017ee vr\u00e1ti\u0165 aj null.<\/p>","protected":false},"excerpt":{"rendered":"<p>U\u017e to tak bude, \u017ee v ka\u017edom programovacom jazyku (a Java nie je v\u00fdnimkou) potrebujete raz za \u010das rie\u0161i\u0165 jeden probl\u00e9m. Ten probl\u00e9m je, \u017ee m\u00e1te met\u00f3du, ktor\u00e1 vracia nejak\u00fd v\u00fdsledok (presnej\u0161ie objekt alebo e\u0161te presnej\u0161ie jeho referenciu), ale m\u00f4\u017ee sa vyskytn\u00fa\u0165 leg\u00e1lny pr\u00edpad, kedy met\u00f3da nevr\u00e1ti ni\u010d. V takom pr\u00edpade sa naj\u010dastej\u0161ie siaha po [&hellip;]<\/p>","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[13],"tags":[],"class_list":["post-100","post","type-post","status-publish","format-standard","hentry","category-vyvoj-softveru"],"_links":{"self":[{"href":"https:\/\/spireng.sk\/en\/wp-json\/wp\/v2\/posts\/100","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/spireng.sk\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/spireng.sk\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/spireng.sk\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/spireng.sk\/en\/wp-json\/wp\/v2\/comments?post=100"}],"version-history":[{"count":4,"href":"https:\/\/spireng.sk\/en\/wp-json\/wp\/v2\/posts\/100\/revisions"}],"predecessor-version":[{"id":264,"href":"https:\/\/spireng.sk\/en\/wp-json\/wp\/v2\/posts\/100\/revisions\/264"}],"wp:attachment":[{"href":"https:\/\/spireng.sk\/en\/wp-json\/wp\/v2\/media?parent=100"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/spireng.sk\/en\/wp-json\/wp\/v2\/categories?post=100"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/spireng.sk\/en\/wp-json\/wp\/v2\/tags?post=100"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}