Reimplementujte a vyskúšajte si Príklad 1. a Príklad 2. z 9. prednášky.
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.
1 2 3 4 5 6 7 8 9 10 |
public static void main(String[] args) { Double sum = 0.0; int n = 1000000; for (double i = 0; i < n; i++) { double x = i/n; double y = x*x; sum = sum + y; } System.out.println(sum/n); } |
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.
Nasledujúci kód je jednoduchou implementáciou funkcie, ktorá zisťuje, či dané číslo je prvočíslo.
1 2 3 4 5 6 7 |
static public boolean prvocislo(long n) { for (long i=2; i< Math.sqrt(n+1); i++) { if(n%i == 0) return false; } return true; } |
Reimplementujte funkciu prvocislo s využitím map-reduce.
Na otestovanie funkcie implementujte jednoduchú aplikáciu.
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:
upravte program tak aby vypísal 50 čísel, vyskúšajte tiež, čo sa stane ak odstánite volanie limit.
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 .
Reimplementujte Úlohu 2. tak, že namiesto zoznamu čisel použijete Supplier postupne generujúci čisla 1,2,3….
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:
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ť.)
Implementujte merge-sort s využitím funkcionálneho programovania. Návod: použite reduce.
podobné budú na ďalších cvičeniach
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:
na výpočet súčtu čísel použite stream-metódu reduce a vhodný lambda výraz
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:
1 2 3 4 |
public static void main(String[] args) { Stream<Double> cisla = Stream.generate(() -> Math.random()).limit(10); System.out.println("Priemer=" + priemer(cisla)); } |
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:
1 2 3 4 5 6 7 8 |
public static void main(String[] args) { List<Double> cisla = new ArrayList<>(); for (int i = 0; i < 10; i++) { cisla.add(Math.random()); } System.out.println("Priemer=" + priemer(cisla)); } |