Úvod do Vavr’s Either

1. Prehľad

Vavr je knižnica rozšírenia objektovo-funkčného jazyka s otvoreným zdrojom pre Java 8+. Pomáha znižovať množstvo kódu a zvyšovať robustnosť.

V tomto článku sa dozvieme o VavrSa volá nástroj Buď. Ak sa chcete dozvedieť viac informácií o Vavr knižnica, pozrite si tento článok.

2. Čo je Buď?

Vo svete funkčného programovania funkčné hodnoty alebo objekty nie je možné upraviť (t.j. v normálnej podobe); v terminológii Java je známa ako nemenné premenné.

Buď predstavuje hodnotu dvoch možných dátových typov. An Buď je buď a Vľavo alebo a Správny. Podľa dohovoru Vľavo znamená výsledok prípadu zlyhania a Správny znamená úspech.

3. Závislosti Maven

Musíme pridať nasledujúcu závislosť do pom.xml:

 io.vavr vavr 0.9.0 

Najnovšia verzia servera Vavr je k dispozícii v centrálnom úložisku Maven.

4. Používajte puzdrá

Uvažujme o prípade použitia, keď potrebujeme vytvoriť metódu, ktorá vezme vstup a na základe tohto vstupu vrátime buď a String alebo an Celé číslo.

4.1. Obyčajná Java

Môžeme to realizovať dvoma spôsobmi. Buď môže naša metóda vrátiť mapu s kľúčom predstavujúcim výsledok úspechu / zlyhania, alebo môže vrátiť pevnú veľkosť Zoznam / pole kde pozícia označuje typ výsledku.

Takto by to mohlo vyzerať:

verejná statická Mapa computeWithoutEitherUsingMap (int mark) {Výsledky mapy = nový HashMap (); if (známky <85) {results.put ("FAILURE", "Značky neprijateľné"); } else {results.put ("ÚSPECH", známky); } návratové výsledky; } public static void main (String [] args) {Map results = computeWithoutEitherUsingMap (8); Chyba reťazca = (Reťazec) results.get ("FAILURE"); int známky = (int) results.get ("ÚSPECH"); }

Pre druhý prístup by sme mohli použiť nasledujúci kód:

verejný statický objekt [] computeWithoutEitherUsingArray (značky int) {Object [] výsledky = nový objekt [2]; if (známky <85) {results [0] = "Značky neprijateľné"; } else {výsledky [1] = známky; } návratové výsledky; }

Ako vidíme, obidva spôsoby vyžadujú pomerne veľa práce a konečný výsledok nie je príliš esteticky príťažlivý ani bezpečný na použitie.

4.2. S Buď

Teraz sa pozrime, ako to môžeme zužitkovať Vavr‘S Buď nástroj na dosiahnutie rovnakého výsledku:

private static Buď computeWithEither (int značky) {if (značky <85) {return Either.left ("Značky neprijateľné"); } else {return Either.right (známky); }} 

Nie, vyžaduje sa explicitné vkladanie typov, kontrola nuly alebo vytváranie nepoužitých objektov.

Navyše, Buď poskytuje veľmi užitočné monadické rozhranie API na riešenie oboch prípadov:

computeWithEither (80) .right () .filter (...) .map (...) // ...

Podľa dohody, Buď je vľavo atribút predstavuje prípad zlyhania a Správny jeden predstavuje úspech. Na základe našich potrieb to však môžeme zmeniť pomocou projekcií - Buď v Vavr nie je zaujatý voči Vľavo alebo Správny.

Ak premietneme do Správny, operácie ako filter (), mapa () nebude mať žiadny vplyv, ak Buď bol Vľavo.

Vytvorme napríklad Správny projekciu a definovať na nej niektoré operácie:

computeWithEither (90) .right () .filter (...) .map (...) .getOrElse (Collections :: emptyList);

Ak sa ukáže, že sme premietali Vľavo do Správny, okamžite dostaneme prázdny zoznam.

Môžeme komunikovať s Vľavo projekcia podobným spôsobom:

computeWithEither (9) .left () .map (FetchError :: getMsg) .forEach (System.out :: println);

4.3. Pridané vlastnosti

Je ich veľa Buď dostupné nástroje; pozrime sa na niektoré z nich.

Môžeme skontrolovať, či Buď obsahovať iba Vľavo alebo Správny použitím je vľavo a je správne metódy:

result.isLeft (); result.isRight ();

Môžeme skontrolovať, či Buď obsahuje dané Správny hodnota:

výsledok. obsahuje (100)

Môžeme zložiť Vľavo a vpravo na jeden bežný typ:

Buď buď = Buď buď v poriadku (42); Výsledok reťazca = either.fold (i -> i, Object :: toString);

alebo ... dokonca zameniť strany:

Buď buď = Buď buď v poriadku (42); Buď swap = either.swap ();

5. Záver

V tomto rýchlom výučbe sme sa dozvedeli o používaní Buď užitočnosť VavrRámec. Viac podrobností na Buď nájdete tu.

Celý zdrojový kód je ako vždy k dispozícii na serveri GitHub.


$config[zx-auto] not found$config[zx-overlay] not found