Funkcionálne programovanie Cvičenie 9 Funkcionálne programovanie v Jave Sergej Chodarev 22. november 2017 Technická Univerzita v Košiciach
Funkcie vyššieho rádu Ako v Jave implementovať funkciu, ktorá manipuluje funkciami? 1
Funkcie vyššieho rádu Ako v Jave implementovať funkciu, ktorá manipuluje funkciami? Použiť namiesto funkcie objekt s jednou metódou. 1
Funkcie vyššieho rádu Ako v Jave implementovať funkciu, ktorá manipuluje funkciami? Použiť namiesto funkcie objekt s jednou metódou. Príklad class LengthComparator implements Comparator<String> { public int compare(string x, String y) { return Integer.compare(x.length(), y.length()); } } Arrays.sort(strings, new LengthComparator()); 1
Anonymne funkcie Výraz lambda (x, y) -> x + y Príklad Arrays.sort(strings, (x, y) -> Integer.compare(x.length(), y.length())); 2
Anonymne funkcie Výraz lambda (x, y) -> x + y Príklad Arrays.sort(strings, (x, y) -> Integer.compare(x.length(), y.length())); Arrays.sort(strings, new Comparator<String>() { public int compare(string x, String y) { return Integer.compare(x.length(), y.length()); } }); 2
Funkcionálne rozhrania / Functional interfaces Funkcionálne rozhranie rozhranie, ktoré má práve jednu abstraktnú metódu. Príklad Comparator<String> bylength = (x, y) -> Integer.compare(x.length(), y.length()); 3
Funkcionálne rozhrania / Functional interfaces Funkcionálne rozhranie rozhranie, ktoré má práve jednu abstraktnú metódu. Príklad Comparator<String> bylength = (x, y) -> Integer.compare(x.length(), y.length()); Štandardné funkcionálne rozhrania java.util.function 3
Referencie na metódy Arrays.sort(strings, (x, y) -> x.comparetoignorecase(y)); 4
Referencie na metódy Arrays.sort(strings, (x, y) -> x.comparetoignorecase(y)); Arrays.sort(strings, String::compareToIgnoreCase); 4
Voľne premenné public static void repeatmessage(string text, int count) { Runnable r = () -> { for (int i = 0; i < count; i++) { System.out.println(text); Thread.yield(); } }; new Thread(r).start(); } Zachytenie voľných premenných uzáver (closure) 5
Prúdy Prúd (Stream) Štruktúra reprezentujúca postupnosť operácií nad kolekciou. Balík java.util.stream 6
Prúdy Prúd (Stream) Štruktúra reprezentujúca postupnosť operácií nad kolekciou. Balík java.util.stream Príklad List<Entry> topnosql = entries.stream().filter(a -> a.gettags().contains("nosql")).sorted(comparator.comparing(entry::getwords).reversed()).limit(3).collect(collectors.tolist()); 6
Primitívne prúdy int wordcount = entries.stream().filter(a -> a.gettags().contains("nosql")).map(entry::getwords).reduce(integer::sum).orelse(0); 7
Primitívne prúdy int wordcount = entries.stream().filter(a -> a.gettags().contains("nosql")).map(entry::getwords).reduce(integer::sum).orelse(0); int wordcount = entries.stream().filter(a -> a.gettags().contains("nosql")).maptoint(entry::getwords).sum(); 7
Paralelné prúdy int wordcount = entries.parallelstream().filter(a -> a.gettags().contains("nosql")).maptoint(entry::getwords).sum(); 8
Vyhodnocovanie na základe požiadavky take 25 (map (^2) [1..]) 9
Vyhodnocovanie na základe požiadavky take 25 (map (^2) [1..]) IntStream.iterate(1, i -> i+1).map(i -> i*i).limit(25).toarray() 9
Vyhodnocovanie na základe požiadavky take 25 (map (^2) [1..]) IntStream.iterate(1, i -> i+1).map(i -> i*i).limit(25).toarray() boolean haslongnosql = entries.stream().filter(a -> a.gettags().contains("nosql")).map(entry::getwords).anymatch(w -> w > 1000); 9
Literatúra Cay S. Horstmann: Lambda Expressions in Java 8 (Dr. Dobb s Journal) Benjamin Winterberg: Java 8 Stream Tutorial Brian Goetz: Lambdas and Streams in Java 8 Libraries (Dr. Dobb s Journal) Edwin Dalorzo: Functional Programming with Java 8 Functions (DZone Java) Aboullaite Mohammed: Java 9 enhancements to Optional/Stream 10