12. seminář - Lambda výrazy, Stream API

TEACHINGJJ2

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.

Vnořené třídy

  • Třída deklarovaná uvnitř jiné třídy
  • Všeříkající dokumentace.
  • Vntřní (třída ve třídě) vs lokální (třída v metodě) vs anonymní (nepojmenovaná lokální, rovnou instanciovaná)
  • Anonymní implementace funknčího rozhraní vs lambda
  • Co je k čemu?
  • Ukázka

Úkoly

Pomocí streamů a lambda výrazů upravte RPN kalkulačku z předchozího semináře.