images/logo.png
Nový obsah pouze na blog.sahaweb.cz Uživatel: Nepřihlášen

O programování 09 - Pokročilé využití streamů a funkcionálního přístupu v Java 8

k8

Protože se jedná se o poslední díl o funkcionálních rysech Javy 8, uvedu zde pár spíše spolu nesouvisejících poznámek.

Při zkoumání funkcionální rysů Java 8 jsem pročetl dost blogů a asi nejvíce mi dal tento.

V dosavadních úvahách jsem používal pouze metody, nedostal jsem se k vyzkoušení predikátů, konzumerů ani producentů, což jsou speciální varianty metod (bez vstupních nebo výstupních parametrů). Ono na úrovni spíše teoretických úvah je arita metod irelevantní.

Pravá síla funkcionálního přístupu vynikne na složitějších konstrukcích, na těch jednoduchých je to často kontraproduktivně matoucí. V tom mi zase pomohl tento článek, kde mě zaujal zápis typu:



List<String> myList = Arrays.asList("a1", "a2", "b1", "c2", "c1");
myList .stream() .filter(s -> s.startsWith("c")) .map(String::toUpperCase) .sorted() .forEach(System.out::println);

To je opravdu celkem čitelný deklarativní zápis toho, co se má s daty dělat a intuitivně chápu, co zápis znamená (až na to nešťastné stream na začátku - opravdu by to bez něj nešlo?).

Ovšem na to, abych takto dokázal psát (a hlavně myslet), bych potřeboval trochu cviku a praxe, protože jsem zvyklý psát kód spíše ve formě sekvenčního algoritmu, tedy "procedurálně" a ne "funkcionálně". Sice jsem programoval 10 let v SQL a PL/SQL ale přesto (nebo právě proto) mi nepřijde, že je funkcionální přístup podobný SQL, což tvrdí někteří mí kolegové. Uznávám, že funkcionální i databázový přístup je podobný v tom, že deklarativně říkám CO a ne JAK, ale tím veškerá podobnost podle mě končí. SQL je založeno na relační algebře kdežto funkcionální programování na lambda kalkulu, což jsou pokud vím dosti odlišná paradigmata.

I když ... v poslední přednášce Algebry II představil docent Polák způsob, jak algebraicky reprezentovat termy i způsob, jak je vyhodnocovat čistě algebraickými prostředky. Tím představil alternativu nebo spíše jiný pohled na predikátovou logiku, resp. z ní odvozené systémy vyhodnocování termů používané jako (teoretický) základ (nejen) funkcionálního programování - pokud si to po cca dvaceti letech vybavuji správně, oprašovat letité poznámky kvůli tomu nebudu. A ze stejného důvod po mě nechtějte formálně přesnou a správnou formulaci toho, co mám vlastně na mysli.

Každopádně jsem byl tehdy celkem překvapen, jak se zdánlivě totálně nesouvisející oblasti (algebra, logika a překladače) potkaly celkem elegantním a pochopitelným způsobem. Takže možná není zas tak velký rozdíl mezi koncepty SQL a funkcionálního programování.

Ale to jsme poněkud odbočili, vraťme se zpět k Java 8, kde mě ještě zaujala existence tříd IntStream, LongStreamDoubleStream. Jejich metoda range() může úplně nahradit použití cyklu, viz následující příklad:



IntStream.range(1, 4).forEach(System.out::println);

Tímto končím s funkcionálními rysy Java 8, ještě si nechávám v zásobě paralelní streamy. A příště už bude čas na něco úplně jiného.

Ale Python to nebude :)

07.03.2017
k8
Přidat názor:
Vyhrazuji si právo libovolný komentář smazat bez udání důvodu. Kritika mi nevadí, ale chci omezit anonymní výkřiky, které nemají s tématem nic společného.
V textu je možné používat HTML tagy a tuto zjednodušenou MarkDown syntaxi
Jméno
Text
Postřehy:
09.04.2020: Pár poznámek o tom, jak fotit (nejen) modely
Tento článek obsahuje moje poznámky a postřehy týkající se focení modelů. Určitě nejde o návod pro ostatní, spíše si to chci sám ujasnit... Když někdo postaví model, vyfotí ho a prezentuje ho na internetu. Typická fotka bohužel vypadá zhruba jako na následujícím obrázku. Takováto fotka podle mě úsilí s tvorbou modelu dosti sráží. Mimochodem, ani se mi nepodařilo vyfotit model tak špatně, jak je
extravaganza.controverso@seznam.cz: Zdravím, krásný a informacemi nabitý blog. Musím pochválit. Plánuji rozjet undergroundový zin, co by se týkal black matalu, ambientu, satanismu, left hand
Poslední diskuse Postřehy
O programování 06 - Návrhové vzory - síla i slabina Javy
P.S. samozrejme "Context" mel byt "Client" .. To jsem jen narazil na nejak divne pojmenovany diagram.. (Context je samozrejme trosku neco jineho...)
...
David | 25.02.2017
O programování 06 - Návrhové vzory - síla i slabina Javy
To k cemu jsi dosel (tedy implementace LooperRunner + ILoopMethod), tak je ta prava Strategy by GoF :) To co je tam dulezite je ze Context (LooperRunner) je oddeleny od Strategy (ILoopMethod),
...
David | 25.02.2017
O programování 03 - Přehlednost funkcionálního zápisu v Java 8
Máš pravdu, to map je tam zbytečné. Odněkud jsem to opsal a nezkontroloval. Tím ovšem trochu padá pointa celého článku.
...
Saha | 14.12.2016
O programování 03 - Přehlednost funkcionálního zápisu v Java 8
Jen takova otazka k tomu druhemu prikladu:
Proc tam tu cast s "map" ktera de facto s prvky toho streamu nic nedela? Nestacilo by
list.stream().reduce(0, Integer::sum);
?
Ja teda moc
...
David P. | 13.12.2016
Paleo na půl - 01 - První tři dny bez mléka
Kvalitní hořké čokolády jsou bez mléka.. :) (a to i ty méně "kvalitní"). Mléko bývá součástí jen těch "sladkých".
...
David | 04.05.2015
Statistiky
Aktualizováno: 06.11.2020
Počet článků/fotek: 1397/13869
(C) Saha - 1990 - 2024 - Verze 1.4.1 - 11.11.2020 - Generated by SHREC 2.225 - SHWB
Veškeré zde uvedené materiály vyjadřují pouze moje soukromé názory (s výjimkou knihy návštěv a diskusí, kam může přispívat kdokoliv), a pokud s nimi někdo nesouhlasí, tak je to jeho problém, nikoliv můj.