I-ASOS Cvičenie 9

9. cvičenie

Java 8: Stream a Lambda Expresions

Úloha 1.

Reimplementujte a vyskúšajte si Príklad 1. a Príklad 2. z 9. prednášky.

Úloha 2.

Nasledujúci program počíta čiastočný sumu nekonečného konvergentného radu. Reimplementujte výpočet s využitím funkcionálneho programovania.

Návod: Inicializujte zoznam obsahujúci čísla 1 až 1000000, vytvorte z neho stream a na výpočet sumy použite následne metódu map-reduce.

Úloha 3

Nasledujúci kód je jednoduchou implementáciou funkcie, ktorá zisťuje, či dané číslo je prvočíslo.

Reimplementujte funkciu prvocislo s využitím map-reduce.

Na otestovanie funkcie implementujte jednoduchú aplikáciu.

Úloha 4.

Stream je možné vygenerovať nielen zo zoznamu ale aj zo objektu, ktorý implementuje Supplier interface. Na stránke javacodegeeks nájdete príklad vytvorenia a použitia streamu náhodne generovaných čísel.

Stiahnite si príklad, môžete aj odtiaľto Yield.java. Aplikácia načíta zo streamu 10 čisel, utriedi ich, uloží do poľa a vypíše.

Preštudujte si zdrojový kód otestujte fukčnosť aplikácie. Následne vyskúšajte rôzne modifikácie:

  • odstráňte triedenie a uloženie do poľa a namiesto toho vypíšte generované čisla priamo pomocou forEach.
  • upravte program tak aby vypísal 50 čísel, vyskúšajte tiež, čo sa stane ak odstánite volanie limit.

  • upravte program tak aby načítal 50 čísel a vypočítal ich priemer.

Pozn. Pre vytvorenie jednoduchého Supplier-a je možné použiť lambda-výrazy. Zjednodušenú verziu tohto príkladu si môžete stiahnuť odtiaľto RandomSupplier.java .

Úloha 5.

Reimplementujte Úlohu 2. tak, že namiesto zoznamu čisel použijete Supplier postupne generujúci čisla 1,2,3….

Úloha 6.

Reimplementujte Príklad 1. z 9. prednášky tak, že účty načítate z databázy pomocou JDBC dotazu st.executeQuery(„SELECT count(*) FROM UCET“);, pričom:

  1. účty načitate do zoznamu naraz a z neho vytvoríte stream
  2. stream vytvoríte zo Suppliera (pozri úlohu 4.), ktorý postupne iteruje resultset.

Riešenie najdete tu UcetSupplier.java. (Pozn. Tabuľka použitá v riešení má trochu odlišnú štruktúru. Riešenie si treba prisposobiť.)

Úloha 7.

Implementujte merge-sort s využitím funkcionálneho programovania. Návod: použite reduce.

Ďalšie úlohy – z minulých rokov.

podobné budú na ďalších cvičeniach

U1.

A. Implementujte funkciu double priemer(List<Double> data), ktorá dostane zoznam čísel a vypočíta ich priemer pomocou funkcionálnych Stream-metód. Poznámky:

  • Funkcia priemer vytvorí zo zoznamu stream čísel a
    • na výpočet súčtu čísel použite stream-metódu reduce a vhodný lambda výraz

    • zistenie počtu čísel použite stream metódu count.
    • presvedče sa, že pre výpočet počtu aj súčtu nie je možné použiť ten istý stream. (treba ho nanovo vytvoriť zo zoznamu).
  • Metóda reduce s jedným parametrom vracia objekt Optional, výslednú hodnotu z neho dostanete pomocou get(). Môžete použiť metódu reduce s dvoma parametrami, ktorá výslednú hodnotu vracia priamo. Vyskúšajte a provnajte obe verzie.

Otestovať ju môžete programom:

B. Skúste implementovať výpočet priemeru ako funkciu, ktorá dostane ako vstup stream čisel: double priemer(Stream<Double> data)Otestovať ju môžete programom: