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í.