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