Seminář 11
Obsah
- Lokální a anonymní třídy
- Lambda výrazy a funkční rozhranní
- Stream API
Lokální a anonymní třídy
- Již známe vnitřní třídy (třída deklarovaná uvnitř jiné třídy).
- Existují i tzv. lokální třídy, definované uvnitř nějakého bloku pro lokální použití.
- Nadto mám i jejich anonymní verze pro jednorázové použití - rovnou vytváříme jedinou instanci.
- Tedy:
- Vntřní (třída ve třídě)
- vs lokální (třída v metodě)
- vs anonymní (nepojmenovaná lokální, rovnou instanciovaná)
Funkční rozhraní
- Za chvíli uvidíme lambda výrazy v javě.
- Lze na ně pohlížet jako na zkratky za tzv “funkční rozhraní”.
- Nejdříve funkční 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: () → ()
Vlastní funčkní rozhraní
- lze vytvářet vlastní funkční rozhraní:
- jediná abstraktní metoda (to je deklarace funkce, kterou budeme dodávat),
- případný statický obsah,
- je vhodné rozhraní označit anotací
@FunctionalInterface
.
Lambda výrazy
- Obvyklý tutoriál.
- Anonymní funkce.
- 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.
- Každé funkční rozhraní reprezentuje typ pro anonymní funkce (signaturou své jediné abstraktní metody).
- Chcete-li anonymní funkci předat jako parametr nebo uložit do proměnné, použijte jako typ právě odpovídající funkční rozhraní.
Jak to spolu všechno souvisí
- Anonymní implementace funknčího rozhraní vs lambda vs anonymní třída
- Co je k čemu?
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.
Úkol
- Upravte svou RPN kalkulačku tak, aby vhodně využívala funkčních rozhranní, lambda výrazů a anonymních tříd.