4it101»Java8pr 2 Reseni

Java8pr 2 Reseni

Příklad Kalkulačka - řešení

Níže popsaný postup řešení této úlohy bude opět vycházet z doporučeného postupu v zadání. Tudíž nejprve je nutné vytvořit si vlastní funkční rozhraní s abstraktní metodou (viz níže).


interface MatematickaOperace {
        double operace(double a, double b);  
    }

 

V druhém kroku je nastíněn fakt, že lze řešit tuto úlohu různě. Níže je uveden pouze jeden z možných způsobů řešení. Tím je, že pro každou operaci se vytvoří jedna instance funkčního rozhraní MatematickaOprace. Každá z nich vznikne pomocí jednoduchého lambda výrazu implementujícího danou operaci.

To, která instance se použije pro výpočet, se rozhodne pomocí podmínky založené na tom, jaký matematický operátor je uveden ve vstupu od uživatele (tzn. jedná se o znak obsažený v druhé položce pole slova tedy slova[1]). V ukázce níže, byl pro lepší přehlednost zvolen příkaz switch. Na základě zvoleného operátoru je vybrána ta instance funkčního rozhraní, která implementuje metodu operace() požadovaným způsobem. Jako parametry této metody jsou vždy zadány hodnoty proměnných a a b, což jsou hodnoty zadané uživatelem.


   MatematickaOperace scitani = (a, b) -> a + b;
        MatematickaOperace odcitani = (a, b) -> a - b;
        MatematickaOperace nasobeni = (a, b) -> a * b;
        MatematickaOperace deleni = (a, b) -> a / b;

        switch (slova[1]) {
            case "+":  vysledek = scitani.operace(a, b);
                     break;
            case "-":  vysledek = odcitani.operace(a, b);
                     break;
            case "*":  vysledek = nasobeni.operace(a, b);
                     break;
            case "/":  vysledek = deleni.operace(a, b);
                     break;
        }


 

Celkové řešení je v projektu Kalkulačka - řešení.

Další možností řešení je vytvořit pomocí blokového lambda výrazu pouze jednu instanci funkčního rozhraní, kde se v těle lambda výrazu bude (například pomocí příkazu switch) rozhodovat, jaký výsledek vrátit. A poté stačí jen na tuto instanci zavolat metodu operace() s příslušnými parametry.