4it101»Java8pr 15 Reseni

Java8pr 15 Reseni

Příklad Zaměstnanci - řešení

Pomocí datových proudů je řešení vcelku snadné. Pro přehlednost je vhodné vytvořit si pomocnou metodu, která bude vracet výsledek. Jako parametr bude mít zdrojový seznam zaměstnanců. Z tohoto seznamu pak v těle metody lze vytvořit datový proud. Jelikož není třeba prvky nějak upravovat, je možné rovnou zavolat metodu collect(Collector<? super T, A, R> collector).

Pro vytvoření instance rozhraní Collector<T,A,R> lze použít některou z metod třídy Collectors. Metodou, která roztřídí prvky do dvou skupin dle true a false, je metoda partitioninyBy(). Tato metoda má jako parametr funkční rozhraní Predicate<T>. Instanci tohoto rozhraní lze snadno získat tak, že pomocí lambda výrazu naimplementujeme bstraktní metodu tohoto rozhraní. Takovýto lambda výraz porovná, zda je pohlaví prvku muž nebo žena, a na základě této podmínky prvky rozřadí. Vrací tak mapu, která typem přesně odpovídá této úloze. Jak toto řešení vypadá je ukázáno na výpise níže.


public Map<Boolean,List<Zamestnanec>> setMapa(List<Zamestnanec> seznam){
   return seznam.stream()
                .collect(Collectors.partitioningBy((p)-> p.getPohlavi()==Pohlavi.MUZ));
    }

 

Co se týče rozšiřující úlohy, tak ji lze řešit velmi podobně. Místo metody partitioningBy() je ovšem nutné zvolit jinou metodu, která umožní zvolit si vlastní klíče mapy. Takovou metodou je metoda groupingBy(), která má jako parametr funkční rozhraní Function<T,R>. K získání instance tohoto funkčního rozhraní je třeba doplnit jako parametr patřičný lambda výraz říkající, který atribut zaměstnance má být ten, podle kterého se budou prvky seskupovat.


public Map<Pohlavi , List<Zamestnanec>> setMapa2 (List<Zamestnanec> seznam){
    return seznam.stream()
                .collect(Collectors.groupingBy((p)-> p.getPohlavi()));
    }


 

Celkové řešení (jak hlavní, tak i jejího rozšíření) je v projektu Zaměstnanci - řešení.