4it101»Java8pr 14 Reseni

Java8pr 14 Reseni

Příklad Hledání zvířat - řešení

Jelikož řešení všech tří částí úlohy jsou si podobná, je pohodlnější si vytvořit obecnou metodu pro filtrování a filtrovací podmínka se jí zadá jako parametr. Tato metoda nemusí nic vracet, protože účelem je vyhledaná data pouze vypsat do konzole. Metoda bude mít dva parametry: vstupní seznam zvířat a již zmiňovanou podmínku. K zápisu této podmínky se vrátím v následujícím textu.

Úloha má být řešena pomocí datových proudů, proto je nutné vstupní seznam nejprve na datový proud převést. Vzniklý datový proud ovšem obsahuje všechny prvky seznamu. Tyto prvky je tedy potřeba vyfiltrovat tak, aby v datovém proudu zůstaly jen ty požadované. To zajistí metoda filter(Predicate <? super T> pred). Tato metoda má jako parametr funkční rozhraní Predicate<T>. Instance tohoto rozhraní, kterou lze vytvořit pomocí lambda výrazu, představuje právě tu „podmínku“, kterou je nutné pomocné metodě zadat jako parametr. Nakonec se datový proud vypíše pomocí metody rozhraní Stream<T> forEach() do konzole. Konečnou verzi metody tedy lze vidět z výpisu níže


public void filtrovatZvirata(List<Zvire> seznam, Predicate<Zvire> predikat){

        seznam.stream().filter(predikat).forEach((n) -> System.out.println(n));
   }


 

Nyní jen stačí tuto metodu zavolat se správnými parametry. Jelikož lambda výrazy pro udání podmínek mohou být složitější, pro přehlednost je vhodnější si vytvořit nejprve instance rozhraní Predicate<T> zvlášť a ty pak dosazovat při volání metody filtrovatZvirata().

Prvním hledáním mají být čtyřnozí savci. Do těla lambda výrazu je tedy nutné zakomponovat dvě podmínky (druh = savec a počet nohou = 4) spojené logickou spojkou AND (musí platit obě současně). Dále je v zadání: vyhledat ta zvířata, kterým je jeden rok. Zde je podmínka snadná, stačí ověřit, zda se věk rovná 1. Posledním úkolem je vypsat zvířata, jejichž věk je liché číslo. To se zjistí vydělením věku zvířete dvěma se zbytkem a ověřením, zda je zbytek různý od nuly. Výsledné podmínky lze vidět na výpisu níže.

 

Predicate<Zvire> ctyrnohySavec = x -> x.getDruh().equals("savec")  && x.getPocetNohou() == 4;

Predicate<Zvire> jednorocniZvire = x -> x.getVek() == 1;
Predicate<Zvire> lichyVek = x -> x.getVek() % 2 != 0;

 

Celkové řešení je v projektu Hledani Zvířat - řešení.