{"id":94,"date":"2017-03-29T20:11:11","date_gmt":"2017-03-29T18:11:11","guid":{"rendered":""},"modified":"2018-09-17T21:51:33","modified_gmt":"2018-09-17T19:51:33","slug":"java-8-lambda","status":"publish","type":"post","link":"https:\/\/spireng.sk\/en\/java-8-lambda\/","title":{"rendered":"Java 8: Lambda"},"content":{"rendered":"<p><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=\"150\" height=\"160\" \/>Java 8 je u\u017e nejak\u00fd \u010das s nami (presnej\u0161ie od 18. marca 2014). A je to verzia, ktor\u00e1 so sebou priniesla hne\u010f nieko\u013eko noviniek (prirovn\u00e1vaj\u00fa ju k verzii 5, ktor\u00e1 priniesla anot\u00e1cie alebo generika). Niektor\u00e9 s\u00fa naozaj ve\u013ek\u00e9 zmeny a nie jeden Java developer kr\u00fati hlavou, \u010do to s t\u00fdm jazykom Oracle stv\u00e1ra. Ale v\u00fdvoj nezastav\u00ed\u0161 a v\u0161etko smeruje k Lispu (ako som kdesi \u010d\u00edtal \ud83d\ude42 ). Java 8 je tu a my sa v s\u00e9rii \u010dl\u00e1nkov spolu pozrieme na niektor\u00e9 novinky, ktor\u00e9 prin\u00e1\u0161a. Dnes to nebude ni\u010d men\u0161ie a menej zauj\u00edmav\u00e9 ako Lambda v\u00fdrazy.<!--more--><!--break--><\/p>\n<p>Ak nejak\u00fd \u010das programujete v Jave, museli ste sa stretn\u00fa\u0165 s nie\u010d\u00edm, \u010do sa naz\u00fdva <a href=\"https:\/\/docs.oracle.com\/javase\/tutorial\/java\/javaOO\/anonymousclasses.html\">anonymn\u00e1 trieda<\/a>. Je to v podstate implement\u00e1cia rozhrania pomocou triedy, ktor\u00e1 nem\u00e1 meno a je ur\u010den\u00e1 na pou\u017eitie na jednom mieste v k\u00f3de. S anonymn\u00fdmi triedami sa stretnete naj\u010dastej\u0161ie tam, kde je potrebn\u00e9 posla\u0165 triedu, ktor\u00e1 implementuje nejak\u00e9 rozhranie, a t\u00e1to jej implement\u00e1cia m\u00e1 zmysel len na tomto jednom mieste. Napr\u00edklad nie\u010do tak\u00e9to:<\/p>\n<pre>button.addActionListener(new ActionListener() {\r\n  @Override\r\n  public void actionPerformed(ActionEvent e) {\r\n    \/\/tvoj kod pride sem\r\n  }\r\n});<\/pre>\n<p>\u010co n\u00e1m ten k\u00f3d hovor\u00ed je, \u017ee v rozhran\u00ed <em>ActionListener<\/em> sme pre tento pr\u00edpad implementovali met\u00f3du <em>actionPerfomed<\/em>. Samotn\u00e1 implement\u00e1cia met\u00f3dy je riadok <em>\/\/tvoj kod pride sem<\/em>. V\u0161etko ostatn\u00e9 je dekor\u00e1cia okolo toho.<\/p>\n<p>To je celkom dos\u0165 k\u00f3du kv\u00f4li jedn\u00e9mu riadku implement\u00e1cie. Ako program\u00e1tori, ktor\u00ed radi sk\u00fa\u0161aj\u00fa nov\u00e9 veci, si to teraz nap\u00ed\u0161eme Lambda v\u00fdrazom:<\/p>\n<pre>button.addActionListener(() -&gt; {\r\n\/\/ tvoj kod pride sem\r\n});<\/pre>\n<p>To je, ako mus\u00edte uzna\u0165, o dos\u0165 menej ozd\u00f4b okolo samotn\u00e9ho tela met\u00f3dy. \u010co teda Lambda v\u00fdrazy s\u00fa?<\/p>\n<p>Laicky by sa dalo poveda\u0165, \u017ee reprezentuj\u00fa odkaz na met\u00f3du, ktor\u00e1 bola definovan\u00e1 na danom mieste. Je to teda anonymn\u00e1 met\u00f3da \u2013 nem\u00e1 n\u00e1zov \u2013 a aj preto sa d\u00e1 pou\u017ei\u0165 len tak, kde bola definovan\u00e1. Po\u010fme si teraz trochu rozpitva\u0165 syntax. Spr\u00e1vny Lamba v\u00fdraz sa sklad\u00e1 z troch zlo\u017eiek:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"imgp_img aligncenter\" style=\"display: block; margin-left: auto; margin-right: auto;\" src=\"\/sites\/default\/files\/imagepicker\/1\/lambda.jpg\" alt=\"Obr\u00e1zok\" width=\"635\" height=\"74\" \/>Zoznam argumentov m\u00f4\u017ee by\u0165 pr\u00e1zdny, ako napr\u00edklad:<\/p>\n<pre>() -&gt; { System.out.println(\u201eGordon Freeman\u201c); }<\/pre>\n<p>Typy argumentov m\u00f4\u017eu a nemusia by\u0165 definovan\u00e9. Tieto dva v\u00fdrazy s\u00fa rovnocenn\u00e9:<\/p>\n<pre>(e) -&gt; { System.out.println(e); }\r\n(String e) -&gt; { System.out.println(e); }<\/pre>\n<p>V pr\u00edpade, ak typ nie je explicitne zadefinovan\u00fd, je odvoden\u00fd. Ak m\u00e1 Lambda v\u00fdraz len jeden parameter, m\u00f4\u017eete \u00faplne vynecha\u0165 z\u00e1tvorky pre parametre:<\/p>\n<p>e -&gt; { System.out.println(e); }<\/p>\n<p>\u010co sa t\u00fdka tela Lambda v\u00fdrazu, tie\u017e o \u0148om plat\u00ed nieko\u013eko vec\u00ed. Ak obsahuje len jeden riadok, nemus\u00edme pou\u017e\u00edva\u0165 zlo\u017een\u00e9 z\u00e1tvorky:<\/p>\n<p>e -&gt; System.out.println(e);<\/p>\n<p>A ak m\u00e1 Lambda v\u00fdraz vraca\u0165 hodnotu (typ hodnoty je op\u00e4\u0165 odvoden\u00fd) a telo obsahuje jeden riadok, tak k\u013e\u00fa\u010dov\u00e9 slovo <strong>return<\/strong><span style=\"font-weight: normal;\"> m\u00f4\u017eete vynecha\u0165:<\/span><\/p>\n<p>(x, y) -&gt; x + y<\/p>\n<p>Lambda v\u00fdrazy maj\u00fa jednu \u0161pecialitu. Vedia pristupova\u0165 k lok\u00e1lnym premenn\u00fdm definovan\u00fdm v scope ako s\u00fa oni sam\u00e9, ale dan\u00e1 premenn\u00e1 mus\u00ed by\u0165 final. Mus\u00ed to napr\u00edklad vyzera\u0165 nejako takto:<\/p>\n<pre>int x = 10;\r\ndoSomething(e -&gt; System.out.println(x));<\/pre>\n<p>V tomto pr\u00edpade sa teda Lambda odkazuje na premenn\u00fa x, ktor\u00e1 je definovan\u00e1 na tej istej \u00farovni ako samotn\u00e1 lambda. Mo\u017eno ste si v\u0161imli, \u017ee som nepou\u017eil k\u013e\u00fa\u010dov\u00e9 slovo final. V tomto pr\u00edpade ani <span style=\"font-weight: normal;\">nie <\/span><span style=\"font-weight: normal;\">je treba. S 8-kou toti\u017e pri\u0161iel aj nov\u00fd pojem <\/span><em><span style=\"font-weight: normal;\">effective final<\/span><\/em><span style=\"font-style: normal;\"><span style=\"font-weight: normal;\">. To je vtedy, ke\u010f premenn\u00e1 s\u00edce nie je ozna\u010den\u00e1 ako final, ale hodn<\/span><\/span><span style=\"font-style: normal;\"><span style=\"font-weight: normal;\">ot<\/span><\/span><span style=\"font-style: normal;\"><span style=\"font-weight: normal;\">a je jej priraden\u00e1 len raz. Lambde sta\u010d\u00ed aj effective final.<\/span><\/span><\/p>\n<p><span style=\"font-weight: normal;\">Lambda v\u00fdrazy predstavuj\u00fa naozaj <\/span><span style=\"font-weight: normal;\">ve\u013ea syntaktick\u00e9ho cukru <\/span><span style=\"font-weight: normal;\">a na prv\u00fd poh\u013ead by <\/span><span style=\"font-weight: normal;\">mohli vyzera\u0165 len ako hra\u010dka pre program\u00e1tora. <\/span><span style=\"font-weight: normal;\">Ale v skuto\u010dnosti je <\/span><span style=\"font-weight: normal;\">to <\/span><span style=\"font-weight: normal;\">jeden prvok, \u010do rob\u00ed v Jave 8 z funkci<\/span><span style=\"font-weight: normal;\">\u00ed<\/span><span style=\"font-weight: normal;\"> takzvan<\/span><span style=\"font-weight: normal;\">\u00fd<\/span><span style=\"font-weight: normal;\"> first-class citizen. To znamen\u00e1, \u017ee ved\u013ea tried, objektov a primit\u00edvnych typov pribudol nov\u00fd druh, s ktor\u00fdm je mo\u017en\u00e9 manipulova\u0165 tak, \u017ee sa uchov\u00e1va v premennej alebo posiela ako parameter do met\u00f3dy. Toto je pre Javu ve\u013ek\u00fd filozofick\u00fd posun a otv\u00e1ra to dvere pre \u010fal\u0161ie mo\u017enosti.<\/span><\/p>\n<p><span style=\"font-weight: normal;\">A aj Lambda v\u00fdrazy s\u00fa v skuto\u010dnosti len jedn\u00fdm dielom sklada\u010dky a ke\u010f sa za\u010dn\u00fa kombinova\u0165 s nov\u00fdmi funk\u010dn\u00fdmi rozhraniami v bal\u00edku <\/span>java.util.function<span style=\"font-weight: normal;\"> a nov\u00fdm Collection API, len vtedy to za\u010dne by\u0165 zauj\u00edmav\u00e9. Ale o tom nabud\u00face.<\/span><\/p>","protected":false},"excerpt":{"rendered":"<p>Java 8 je u\u017e nejak\u00fd \u010das s nami (presnej\u0161ie od 18. marca 2014). A je to verzia, ktor\u00e1 so sebou priniesla hne\u010f nieko\u013eko noviniek (prirovn\u00e1vaj\u00fa ju k verzii 5, ktor\u00e1 priniesla anot\u00e1cie alebo generika). Niektor\u00e9 s\u00fa naozaj ve\u013ek\u00e9 zmeny a nie jeden Java developer kr\u00fati hlavou, \u010do to s t\u00fdm jazykom Oracle stv\u00e1ra. Ale v\u00fdvoj [&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-94","post","type-post","status-publish","format-standard","hentry","category-vyvoj-softveru"],"_links":{"self":[{"href":"https:\/\/spireng.sk\/en\/wp-json\/wp\/v2\/posts\/94","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=94"}],"version-history":[{"count":3,"href":"https:\/\/spireng.sk\/en\/wp-json\/wp\/v2\/posts\/94\/revisions"}],"predecessor-version":[{"id":270,"href":"https:\/\/spireng.sk\/en\/wp-json\/wp\/v2\/posts\/94\/revisions\/270"}],"wp:attachment":[{"href":"https:\/\/spireng.sk\/en\/wp-json\/wp\/v2\/media?parent=94"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/spireng.sk\/en\/wp-json\/wp\/v2\/categories?post=94"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/spireng.sk\/en\/wp-json\/wp\/v2\/tags?post=94"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}