Příklad ZOO - řešení
Tato úloha lze snadno řešit pomocí datových proudů. Může existovat více způsobů řešení, nicméně zde je uveden pouze jeden z nich.
Postup, který je popsaný v této práci, vyžaduje dvě pomocné metody. Jedna vytvoří ze seznamu mapu, která bude mít jako klíč druh zvířat a hodnotou bude seznam zvířat daného druhu. Druhá metoda pak zjistí počet zvířat v daném seznamu a transformuje tuto mapu do mapy výsledné tak, jak určuje zadání.
První metoda bude mít jako parametr seznam List<Zvire>
. V těle metody se z tohoto seznamu vytvoří datový proud, na který se následně zavolá metoda groupingBy()
. Tato metoda má jako parametr funkční rozhraní Function<T,R>
. Instanci tohoto rozhraní lze vytvořit snadno pomocí lambda výrazu, kterým se určí, dle čeho chceme prvky seskupovat do mapy.
Mapa získaná pomocí první metody, ale neudává počet zvířat daného druhu. Z tohoto důvodu je potřeba druhé metody, která má jako parametr Map<String, List<Zvire>>
, což je typ výsledku předchozí metody. Návratovou hodnou této metody je již požadovaná mapa s klíčem představující druh a hodnotou představující počet zvířat daného druhu.
Na výpisu níže lze vidět vzájemná závislost mezi oběma metodami. V metodě ziskatPocetKs()
je použita pomocná mapa již požadovaného typu, která je následně pomocí metody rozhraní Map forEach()
naplněna. Parametrem metody forEach()
je instance rozhraní Consumer<T>
. Opět k jejímu získání slouží lambda výraz, který má dva parametry: klíč a hodnota mapy. Klíč zůstává i pro tuto transformovanou mapu stejný. Jako hodnota je pak vložen počet prvků v seznamu zvířat daného druhu (lze ho získat pomocí metody size()
). Pro použití pak jen stačí zavolat metodu ziskatMapu()
a jako parametr jí vložit zdrojový seznam. Takto získanou mapu pak stačí vložit jako parametr metody ziskatPocetKs()
, která již vrátí požadovaný výsledek.
public Map<String, List<Zvire>> ziskatMapu(List<Zvire> seznam) {
return seznam.stream().collect(Collectors.groupingBy(x -> x.getDruh()));
}
public Map<String, Integer> ziskatPocetKs(Map<String, List<Zvire>> mapa) {
Map<String, Integer> pomocnaMapa = new HashMap<>();
mapa.forEach((druh, seznam) -> pomocnaMapa.put(druh, seznam.size()));
return pomocnaMapa;
}
Celkové řešení je v projektu ZOO - řešení.