4it101»Java8pr 13 Reseni

Java8pr 13 Reseni

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