Seminář 9
Obsah
- Lambda výrazy
- Stream API
Lambda výrazy
- Obvyklý tutoriál.
- Anonymní funkce.
- Souvisejí s anonymními třídami (uvidíme později).
- First class citizen:
- lze je vracet z funkcí,
- lze je předávat jako argumenty,
- lze je brát jako anonymní hodnotu,
- lze je ukládat do proměnných a datových struktur.
Nejdříve ale musíme projít několik funkcionálních rozhraní pro nejběžnější typy anonymních funkcí.
Co si z toho odnést? (A, B, C jsou nějaké objektové typy, () je prázdný typ)
- Supplier<A>: () → A
- Consumer<A>: A → ()
- Callable<A>: () → A throws Exception
- Function<A,B>: A → B
- BiFunction<A,B,C>: A, B → C
- Predicate<A>: A → boolean
- UnaryOperator<A>: A → A
- BinaryOperator<A>: A, A → A
Plus existují specifické verze pro nejčastější typy argumentů. Navíc Runnable:
- Runnable: () → ()
Případně lze vytvořit vlastní funkcionální rozhraní:
- jediná abstraktní metoda (to je deklarace funkce, kterou budeme dodávat),
- případný statický obsah,
- je vhodné rozhraní označit anotací
@FunctionalInterface
.
Všechna rozhraní výše jsou funkcionální rozhraní. Každá anonymní funkce reprezentuje nějaké funkcionální rozhraní.
Stream API
- Práce s “kolekcemi” ve funkcionálním stylu:
- líné vyhodnocování (nic se nevyhodnotí, dokud to není nutné)
- imutabilita (jen strukturální !),
- implicitní paralelismus (stream není kolekce, má jiná pravidla),
- pipeline (operace na streamu lze řetězit - mocné v kombinaci s předchozími vlastnostmi),
- agregační operace vs iterator (stream není Iterable).
- Dokumentace stream API.
- Tutoriál ke stream API.
- Ukázka z hodiny.