4it101»Java8pr 7 Reseni

Java8pr 7 Reseni

Příklad Hledání osob - řešení

Pro řešení je přehlednější vytvořit si novou metodu, která bude vracet instanci třídy Osoba, a mít stejně jako původní metoda dva parametry: List<Osoba> a String představující zadané jméno.

Jelikož úkolem je použít k řešení datové proudy, je nutné vložený seznam v těle metody nejprve převést na datový proud. Získáme tak datový proud, jehož prvky tvoří všechny osoby ve zdrojovém seznamu. Dále je nutné tento seznam vyfiltrovat dle zadaného jména tak, abychom získali pouze jednu osobu s tímto jménem. K tomu slouží metoda filter(Predicate <? super T> pred). Jako parametr vyžaduje instanci funkčního rozhraní Predicate<T>, jehož abstraktní metoda vrací pouze true nebo false. Touto abstraktní metodou je metoda test().

Instanci tohoto rozhraní je snadné získat s pomocí vhodného lambda výrazu. V těle lambda výrazu se tedy jen udá, že chceme zadané jméno porovnat se jménem dané osoby v seznamu pomocí metody equals(). Metoda filter() se pak postará o to, aby v daném datovém toku zbyly jen ty prvky, které vrátí po vyhodnocení true. Nicméně účelem metody je vrátit pouze jeden prvek, proto je ještě potřeba zavolat metodu findAny() nebo findFirst(). V tomto případě se vždy vrátí pouze jeden prvek (viz předvyplněný seznam osob), tudíž v tomto případě obě vždy vrátí stejný výsledek.

Metoda findAny() (příp. findFirst()) vrací instanci rozhraní Optional<T>. Tato instance může a nemusí mít hodnotu. Pokud bychom ovšem zavolali metodu get() na instanci, která je null, vyhodila by se výjimka. Z tohoto důvodu je vhodné instanci otestovat metodou isPresent(). Až na základě tohoto vyhodnocení lze zavolat metodu get() a získat tak instanci třídy Osoba. Výsledná podoba nové metody je ukázána na níže.


public Osoba najdiOsobuUpravene (List<Osoba> seznam, String jmeno){
        Osoba nalezena = null;
        Optional<Osoba> o = seznam.stream()
                        .filter((i) -> i.getJmeno().equals(jmeno))
                        .findAny();
        if(o.isPresent()){
            nalezena = o.get();
        }
        return nalezena;
    }


 

Celkové řešení je v projektu Hledání osob - řešení.