Štvou mě Streamy v Java 8

Robokot

Re:Štvou mě Streamy v Java 8
« Odpověď #15 kdy: 28. 04. 2018, 12:40:05 »
Streamy do Javy přidali, aby byla víc funkcionální, protože to je teď cool :) Koukám, že ne každý to ocení... Ale buď rád, že tam ještě nejsou monadické transformery, komonády a další perly funkcionalismu...

Abys moh dostat doktorat z Computer Sciences, musis v ramci disertacky vymyslet neco noveho.
A kdyz uz z duvod vycerpani tematu uz nic rozumneho vymyslet jen tak nejde, musis zacit vymyslet picoviny.
Picoviny, ale nove, to je cesta k doktoratu.
Je otázkou, či je toto problém len v Computer Science. Koľko zbytočných pičovín (ale originálnych!) vznikne na jednu ozaj užitočnú, tiež originálnu myšlienku (ktorú nakoniec asi zadupu pod zem lebo málo citácii a pod.)
Např. derivace algebraických datových typů :) ty ovšem patří k tomu užitečnějšímu...


Jano7

Re:Štvou mě Streamy v Java 8
« Odpověď #16 kdy: 28. 04. 2018, 12:48:52 »
Streamy sú nesmierne mocný nástroj na spracovanie dát. Keď som sa s tým prvý krát oboznámil, tak som bol nadšený.
Vzbudilo to tiež vo mne hlbší záujem o funkcionálne programovanie. Jazyk Python tieť nie je primárne fukcionálny jazyk, ale má svoje list comprehensions, ktoré sú veľmi efektívne pri práci s dátami.

Vezmime si nasledujúci kód:

Kód: [Vybrat]
       
int[] vals = { -4, 3, 5, 5, 7, -9, 0, 0, 12, 15, 11, -5, 2, 1, 7 };
Arrays.sort(vals);

System.out.println(Arrays.toString(vals));

Má jeden veľmi nepríjemný side effect, a to je in-place sorting dát. Čo je ale nemusí byť to, čo potrebujem.
Funkcionálne programovanie nás takýchto side-effektov ušetrí.

Kód: [Vybrat]
       
int[] vals = { 199, 199, 199, 199, -4, 3, 5, 5, 7, -9, 0, 0, 12, 15, 11, -5, 2, 1, 7 };

Arrays.stream(vals).skip(4).distinct().filter(e -> e > 0).map(e -> e * 2)
        .filter(e -> e < 25).forEach(System.out::println);
       

Koľko smyčiek budeme potrebovať, aby sme toto spravili bez streamov?

Robokot

Re:Štvou mě Streamy v Java 8
« Odpověď #17 kdy: 28. 04. 2018, 14:19:51 »
Mnohem bych radsi, kdyby do Jawy implementovali Gorutiny
To by ovšem šlo dost těžko, to chce podporu runtimu pro kooperativní multitasking.

Sten

Re:Štvou mě Streamy v Java 8
« Odpověď #18 kdy: 28. 04. 2018, 14:40:54 »
Kdyz uz, tak Spring executor service.
http://www.baeldung.com/java-executor-service-tutorial

Executor Service není Spring, ale součást JDK

A podivej se do odkazu, kolik je s tim srani.
Srovnej se spustenim go func() a smytec.

Samotné spouštění úloh je jen jedna metoda (execute, resp. submit). To všechno předtím za vás může řešit framework. Na rozdíl od Go ale máte možnost měnit, jak se to zpracovává (paralelně? sériově? vzdáleně? v jak velkém thread poolu? s jakou prioritou?). Flexibilita nejde udělat jednoduše. Ale jestli chcete, aby se to chovalo přesně jako Go, použijte Go, ne Javu ;)

kimec

Re:Štvou mě Streamy v Java 8
« Odpověď #19 kdy: 28. 04. 2018, 14:57:51 »
Paralelní streamy jsou asi nejjednodušší způsob jak něco v Javě paralelizovat. Velkou úsporu kódu přináší i collectory jako group by atd.

A taky pekne nahovno.
Mnohem bych radsi, kdyby do Jawy implementovali Gorutiny a channely.
Streamy v Jawe vypadaj jak rovnak na ohybak.
Na tom sa prave pracuje. preview mal byt uz v 10, ale nestihlo sa. Kazdopadne, ma to prioritu a officialny backing od Oracle.


kimec

Re:Štvou mě Streamy v Java 8
« Odpověď #20 kdy: 28. 04. 2018, 15:48:36 »
Mnohem bych radsi, kdyby do Jawy implementovali Gorutiny
To by ovšem šlo dost těžko, to chce podporu runtimu pro kooperativní multitasking.
Prvotna implementacia v podobe externej kniznice existuje uz najmenej 4 roky a na JDKckovej/nativnej podpore sa aktivne pracuje. Co si pamatam, bude k tomu treba aj Graal, ktory sa opozdil.

balki

Re:Štvou mě Streamy v Java 8
« Odpověď #21 kdy: 28. 04. 2018, 17:07:12 »
Přijde mi, že je těžké něco pěkně naprogramovat samo o sobě, v OOP. Musí si to člověk řádně promyslet. V Javě 8 přibyly Streamy a podle mě situaci zkomplikovaly. Dneska se mě kolega nadšeně zeptal, co na ně říkám. Trochu mi vzal vítr z plachet, protože na ně neříkám nic. Zaprvé nevím, kde bych je použil ... atd.

Osobne ich pouzivam, ked mam vybrat prvky s urcitymi vlastnostami z kolekcie potom nejakym sposobom ich spracovat bud pomocou .map.reduce() alebo v horsom pripade  .forEach() , . Pripadne len ich vybrat do kolekcie pomocou .collect() .

Na streamoch ocenujem ich nazornost, ale problem je casova penalizacia pri ich pouziti. (co sa vsak v buducnosti verim ze vyriesi). Holt si to nemozem hocikde dovolit.

Ale jeden nas externista, co rad pouzival novoty bez rozumu pachal tym kadejake hrozy, ze do zatvorky dal 20 riadkovy imperativny kod a podobne. To som len gulal ocami. Kod v ztvorkach v streamovch by mal byt strucny.

:-)

Re:Štvou mě Streamy v Java 8
« Odpověď #22 kdy: 28. 04. 2018, 19:23:01 »
Přijde mi, že je těžké něco pěkně naprogramovat samo o sobě, v OOP. Musí si to člověk řádně promyslet. V Javě 8 přibyly Streamy a podle mě situaci zkomplikovaly. Dneska se mě kolega nadšeně zeptal, co na ně říkám. Trochu mi vzal vítr z plachet, protože na ně neříkám nic. Zaprvé nevím, kde bych je použil ... atd.

Osobne ich pouzivam, ked mam vybrat prvky s urcitymi vlastnostami z kolekcie potom nejakym sposobom ich spracovat bud pomocou .map.reduce() alebo v horsom pripade  .forEach() , . Pripadne len ich vybrat do kolekcie pomocou .collect() .

Na streamoch ocenujem ich nazornost, ale problem je casova penalizacia pri ich pouziti. (co sa vsak v buducnosti verim ze vyriesi). Holt si to nemozem hocikde dovolit.

Ale jeden nas externista, co rad pouzival novoty bez rozumu pachal tym kadejake hrozy, ze do zatvorky dal 20 riadkovy imperativny kod a podobne. To som len gulal ocami. Kod v ztvorkach v streamovch by mal byt strucny.

To si asi nevidel perl.

OOM

Re:Štvou mě Streamy v Java 8
« Odpověď #23 kdy: 28. 04. 2018, 20:09:17 »
Kód: [Vybrat]
       
int[] vals = { 199, 199, 199, 199, -4, 3, 5, 5, 7, -9, 0, 0, 12, 15, 11, -5, 2, 1, 7 };

Arrays.stream(vals).skip(4).distinct().filter(e -> e > 0).map(e -> e * 2)
        .filter(e -> e < 25).forEach(System.out::println);
       

Koľko smyčiek budeme potrebovať, aby sme toto spravili bez streamov?
jednu

kimec

Re:Štvou mě Streamy v Java 8
« Odpověď #24 kdy: 28. 04. 2018, 20:12:48 »
Streamy sú nesmierne mocný nástroj na spracovanie dát. Keď som sa s tým prvý krát oboznámil, tak som bol nadšený.
Vzbudilo to tiež vo mne hlbší záujem o funkcionálne programovanie. Jazyk Python tieť nie je primárne fukcionálny jazyk, ale má svoje list comprehensions, ktoré sú veľmi efektívne pri práci s dátami.

Vezmime si nasledujúci kód:

Kód: [Vybrat]
       
int[] vals = { -4, 3, 5, 5, 7, -9, 0, 0, 12, 15, 11, -5, 2, 1, 7 };
Arrays.sort(vals);

System.out.println(Arrays.toString(vals));

Má jeden veľmi nepríjemný side effect, a to je in-place sorting dát. Čo je ale nemusí byť to, čo potrebujem.
Funkcionálne programovanie nás takýchto side-effektov ušetrí.

Kód: [Vybrat]
       
int[] vals = { 199, 199, 199, 199, -4, 3, 5, 5, 7, -9, 0, 0, 12, 15, 11, -5, 2, 1, 7 };

Arrays.stream(vals).skip(4).distinct().filter(e -> e > 0).map(e -> e * 2)
        .filter(e -> e < 25).forEach(System.out::println);
       

Koľko smyčiek budeme potrebovať, aby sme toto spravili bez streamov?
Ach jaj, zrovna array primitivnych typov je  prakticky jediny typ arrayu v Jave, ktory sa da iterovat bez nutnosti dereferencovania hodnot na jednotlivych indexoch. Silou mocou potrebujete spomalit jednu z najrychlejsie iterovatelnych struktur.

4 staticke lambdy - pre kazdu sa bude musiet vygenerovat factory bytecode, nasledne naloadovat cez class loader, ani sa to nestihne odJITovat... a to vsetko kvoli forEach, ktory podporuje Java aj cez iny konstrukt, kde nemusite pouzivat index (ak vam tak vadi).

Ivan Nový

Re:Štvou mě Streamy v Java 8
« Odpověď #25 kdy: 28. 04. 2018, 21:14:34 »
Kód: [Vybrat]
       
int[] vals = { 199, 199, 199, 199, -4, 3, 5, 5, 7, -9, 0, 0, 12, 15, 11, -5, 2, 1, 7 };

Arrays.stream(vals).skip(4).distinct().filter(e -> e > 0).map(e -> e * 2)
        .filter(e -> e < 25).forEach(System.out::println);
       

Koľko smyčiek budeme potrebovať, aby sme toto spravili bez streamov?
jednu

A teď co bude pomalejší, průchod stejným polem několikrát po sobě a vyřešení jedné operace, nebo jeden průchod a složitá logika akcí, kterou poslepujete kdoví jak a kdoví proč a která bude i tak zvyšovat režii systému?

Stav virtuálního automatu, v jakém se bude v jednotlivých průchodech nacházet, bude jen stěží z hlavy predikovatelný.

Co se bude snadněji udržovat a modifikovat.

Michal1

Re:Štvou mě Streamy v Java 8
« Odpověď #26 kdy: 28. 04. 2018, 22:22:23 »
Najlepšie by bolo, keby všetci intelektuáli spáchali samovraždu. Všetko len komplikujú a vytvárajú problémy tam, kde žiadne nie su.

OOM

Re:Štvou mě Streamy v Java 8
« Odpověď #27 kdy: 28. 04. 2018, 22:35:40 »
A teď co bude pomalejší, průchod stejným polem několikrát po sobě a vyřešení jedné operace, nebo jeden průchod a složitá logika akcí, kterou poslepujete kdoví jak a kdoví proč a která bude i tak zvyšovat režii systému?

Stav virtuálního automatu, v jakém se bude v jednotlivých průchodech nacházet, bude jen stěží z hlavy predikovatelný.

Co se bude snadněji udržovat a modifikovat.
Ja som iba odpovedal na otazku :). Ak vas to zaujima prvy priechod je asi 300x pomalejsi, druhe volanie uz je na urovni kde zacina loop, ale loop je tiez rychlejsi, pri piatom volani je loop 2x rychlejsi.
Co sa tyka zliepania kodu 'ktovi jak a proc' to plati aj o streamoch a streamy sa budu mozno 'snadneji udrzovat' aj ked som uz videl talk na temu v zmysle don't do this (streamy na 20-30 riadkov..).
Nevidim zmysel v tom robit jednoduchy loop cez streamy, ale pri paralelnom spracovani to ma nieco do seba. Myslim ze netreba vsade bezhlavo pchat streamy. Ak clovek nieco moze, tak to neznamena, ze by aj mal..

Robokot

Re:Štvou mě Streamy v Java 8
« Odpověď #28 kdy: 29. 04. 2018, 00:00:55 »
Najlepšie by bolo, keby všetci intelektuáli spáchali samovraždu. Všetko len komplikujú a vytvárajú problémy tam, kde žiadne nie su.
To bys ještě lovil veverky s klackem v ruce, aby nechcíp hlady ;)

Inteleguan

Re:Štvou mě Streamy v Java 8
« Odpověď #29 kdy: 29. 04. 2018, 03:05:06 »
Najlepšie by bolo, keby všetci intelektuáli spáchali samovraždu. Všetko len komplikujú a vytvárajú problémy tam, kde žiadne nie su.
To bychom se naráz ocitli v Idiokracii. Spíše by to chtělo zbavit se těch slaboduchých, hned by se lépe žilo :)