4it101»Java8pr 16 Reseni

Java8pr 16 Reseni

Příklad Validace hesla - řešení

K řešení tohoto úkolu je zapotřebí mít znalost, jak lambda výrazů, tak i regulárních výrazů a jejich syntaxe používané v jazyce Java. Jelikož úloha se má řešit pomocí lambda výrazů, je nutné použít nějaké funkční rozhraní. Ze zadání je patrné, že se bude jednat o podmínky, které lze pouze splnit nebo nesplnit (true nebo false), nabízí se tedy funkční rozhraní Predicate<T>.

Podmínek je ovšem více než jedna, což lze sice řešit v rámci jednoho lambda výrazu, ale bylo by to značně nepřehledné. Proto funkční rozhraní Predicate<T> má kromě abstraktní metody test() také další metody, které dokáží podmínky řetězit jako například and(). Jak již název metody napovídá, jedná se o logické AND, které se v tomto případě hodí, protože úkolem je, aby heslo splňovalo všechny podmínky najednou.

Nejprve je tedy zapotřebí vytvořit pro každou podmínku jednu instanci rozhraní Predicate<String> (typem je String, protože vstupní hodnotou je heslo v podobě textového řetězce). Tyto instance lze snadno vytvořit za pomocí lambda výrazů. V těle jednotlivých lambda výrazů bude vždy podmínka, která vrací boolean hodnotu. U podmínek týkajících se znaků obsažených v hesle, se přímo nabízí použít metodu matches() a jako parametr jí dosadit regulární výraz, který řetězec zvaliduje.

Dále se vytvoří výsledná instance rozhraní Predicate<String> tak, že instance vytvořené v předchozím kroku na sebe navážeme metodou and(). Na tuto instanci pak stačí zavolat metodu test(), které se jako parametr dosadí heslo k validaci. Výsledný kód je ukázán na výpise níže.

(:source lang=Java -trim +getcode:) Predicate<String> delka = (n) -> n.length()>=8; Predicate<String> cisla = (x) -> x.matches(".*\\d+.*"); Predicate<String> znaky = (j) -> j.matches(".*[*,+,§]+.*"); Predicate<String> pismena = (p) -> p.matches(".*[A-Za-z]+.*"); Predicate<String> vysledek = (delka.and(cisla.and(znaky))).and(pismena); vysledek.test("abc1+");

Celkové řešení je v projektu Validace hesla - řešení.