Java komunita řeší "monády".
o'rly?
Ja napriklad som javista a monady neriesim, ani neviem, co to je. A tom mam ako hobby lisp. Je to nejaky zivocich, alebo co to zerie? Bude vdaka tomu chlieb lacnejsi? Vylieci to vsetky choroby na svete?
Stream API v Java 8 je monada, taktiez
Optional a
CompletableFuture. Odpourcam video z prednasky Rona Presllera (ktore som linkoval vyssie v mojom nudnom prispevku), kde sa k tymto API vyjadruje z pohladu imperativneho programatora.
Problem, ktory vypichuje je, ze akonahle zacnes pouzivat monadicke API v imperativnom jazyku, musis ho pouzivat "az do konca" (
Stream logicky nemozes v polovici chainovania prehodit na klasicku imperativnu
for each slucku, t.j. push vs pull).
Prichadzas o vsetky "features" ako exception handling (defaultny sposob osefovania sideeffectov v Jave), ktory je fundamentalnou sucastou jazyka od jeho vzniku a vynimky musis preklapat na hodnoty (dalej miesto deklaracie monady a jej vykonanie je uplne ine, StackTraces prestanu byt tak jednoznacne atd.)
Samozrejme, ze monady v Jave nie su nove. Davno pred JDK 8 poskytovala monadicke API na pracu s kolekciami pre Javu Guava od Google. Avsak tieto API neboli sucastou core JDK. Ale po novom je monadicke
Streamove API sucastou JDK a implementacia novej funkcionality v JDK8 na niektorych triedach je na nom priamo zavisla (t.j. infekcia prerasta). Kolekcie boli retrofittovane metodami
stream a
parallelStream takze jedny z najstarsich rozhrani prestali byt spatne kompatibilne so starymi JDK (co je v Java svete taky maly jadrovy vybuch).
Navyse
forEach cez
Streamove API nie je tak rychle ako klasicka imperativna slucka
for each ako dokazali JMH benchmarky - takze aj ked to IntelliJ odporuca, netreba preklapat.