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)); } |
Necessary cookies are absolutely essential for the website to function properly. This category only includes cookies that ensures basic functionalities and security features of the website. These cookies do not store any personal information.