4it101»Java8pr 5 Reseni

Java8pr 5 Reseni

Příklad Kladná čísla - řešení

Postup řešení této úlohy bude vycházet z doporučeného postupu v zadání. Pomocná metoda je v tomto případě vhodná, protože bude obsahovat větší množství kódu. Metoda bude vracet seznam typu List<Integer> a, jak je řečeno v nápovědě, bude mít dva parametry (viz níže).


public List<Integer> filtrovatList(List<Integer> seznamCisel,
                                   Predicate<Integer> predicate){
        List<Integer> filtrovanyList = new ArrayList<Integer>();
        for(Integer cislo:seznamCisel){
            if(predicate.test(cislo)){
                filtrovanyList.add(cislo);
            }
        }
        return filtrovanyList;
    }

 

V těle metody se prochází seznam zadaný jako parametr a každá položka (číslo v seznamu) se testuje pomocí abstraktní metody funkčního rozhraní Predicate<T> test(), která vrátí true nebo false podle toho, zda dané číslo splňuje podmínku uvedenou pomocí lambda výrazu nebo ne. Pokud metoda vrátí true, pak je číslo přidáno do pomocného seznamu, který slouží jako návratová hodnota metody.

Dále je nutné vytvořit nový seznam, který bude obsahovat kladná čísla z výchozího seznamu. Tento seznam lze snadno implementovat zavoláním pomocné metody filtrovat() (viz předchozí krok).

Jako hodnoty parametrů jsou zde doplněny: výchozí seznam a instance rozhraní Predicate<T>. Třídu pro vytvoření této instance získáme pomocí lambda výrazu, který zde pouze říká, že metoda test() vrátí true, pokud je dané číslo větší než nula. Důležité je doplnit také generický typ predikátu (což je v tomto případě Integer). Lambda výraz je také možné rovnou doplnit jako parametr při volání metody filtrovat(). To z toho důvodu, že již v parametru pomocné metody je řečeno, že se jedná o instanci rozhraní Predicate<Integer>.

Na závěr je použita metoda Itetable forEach() pro vypsání obsahu seznamu (zde je možné jako parametr použít odkaz metod nebo lambda výraz). Výše popsané řešení je ukázáno níže.


Predicate<Integer> positivni = (i) -> i > 0;

List<Integer> filtrovanyList = p.filtrovatList(p.getSeznamCisel(),positivni);

filtrovanyList.forEach(System.out::println);


 

Celkové řešení je v projektu Kladná čísla - řešení.