Úvod do atlasovskej fúgy

1. Úvod

Fugue je knižnica Java od spoločnosti Atlassian; je to zbierka podporných nástrojov Funkčné programovanie.

V tomto dokumente sa zameriame na najdôležitejšie API rozhrania Fugue a preskúmame ich.

2. Začíname s fugou

Aby sme mohli začať používať Fugue v našich projektoch, musíme pridať nasledujúcu závislosť:

 io.atlassian.fuga fuga 4.5.1 

Najnovšiu verziu hry Fugue môžeme nájsť na Maven Central.

3. Možnosť

Začnime našu cestu pohľadom na Možnosť triedy, na čo je odpoveďou Fugy java.util.Voliteľné.

Ako môžeme hádať podľa názvu, Možnosť 's kontajner predstavujúci potenciálne neprítomnú hodnotu.

Inými slovami, an Možnosť je buď Niektoré hodnota určitého typu resp Žiadne:

Možnosť žiadna = Možnosť.none (); assertFalse (none.isDefined ()); Možnosť some = Option.some ("hodnota"); assertTrue (some.isDefined ()); assertEquals ("hodnota", some.get ()); Možnosť možno = Option.option (someInputValue);

3.1. The mapa Prevádzka

Jedným zo štandardných rozhraní API pre funkčné programovanie je mapa () metóda, ktorá umožňuje použitie poskytnutej funkcie na základné prvky.

Metóda aplikuje poskytnutú funkciu na MožnosťHodnota, ak je k dispozícii:

Možnosť some = Option.some ("value") .map (String :: toUpperCase); assertEquals ("HODNOTA", some.get ());

3.2. Možnosť a a Nulový Hodnota

Okrem rozdielov v pomenovaní urobil Atlassian niekoľko návrhových možností Možnosť ktoré sa líšia od Voliteľné; pozrime sa teraz na ne.

Nemôžeme priamo vytvoriť neprázdny Možnosť držiaci a nulový hodnotu:

Option.some (null);

Vyššie uvedené vyvoláva výnimku.

Jeden však môžeme získať v dôsledku použitia mapa () prevádzka:

Možnosť some = Option.some ("value") .map (x -> null); assertNull (some.get ());

To nie je možné pri jednoduchom použití java.util.Voliteľné.

3.3. Možnosť Is Iterable

Možnosť možno považovať za kolekciu, ktorá obsahuje maximálne jeden prvok, takže má zmysel implementovať Iterable rozhranie.

To výrazne zvyšuje interoperabilitu pri práci so zbierkami / streammi.

Teraz je napríklad možné spojiť ďalšiu kolekciu:

Možnosť some = Option.some ("hodnota"); Iterable strings = Iterables .concat (some, Arrays.asList ("a", "b", "c"));

3.4. Prevádza Možnosť do Prúd

Keďže an Možnosť je Iterable, dá sa previesť na a Prúd ľahko tiež.

Po prevedení sa Prúd inštancia bude mať presne jeden prvok, ak je k dispozícii možnosť, alebo inak nulu:

assertEquals (0, Option.none (). toStream (). count ()); assertEquals (1, Option.some ("hodnota"). toStream (). count ());

3.5. java.util.Voliteľné Interoperabilita

Ak potrebujeme štandard Voliteľné implementáciu môžeme ľahko získať pomocou toOptional () metóda:

Voliteľné voliteľné = Option.none () .toOptional (); assertTrue (Option.fromOptional (voliteľné) .isEmpty ());

3.6. The možnosti Utility Class

Nakoniec Fugue poskytuje niektoré užitočné metódy pre prácu s Možnosťs vo vhodne pomenovaných možnosti trieda.

Vyznačuje sa metódami ako napr filterNie na odstránenie prázdnych možnosti zo zbierky a sploštiť na otočkuing zbierka možnosti do zbierky uzavretých objektov a odfiltrovanie prázdnych Možnosti.

Okrem toho obsahuje niekoľko variantov výťah metóda, ktorá zdvíha a Funkcia do a Funkcia>:

Funkcia f = (Celé číslo x) -> x> 0? x + 1: null; Funkcia zdvihnuté = Options.lift (f); assertEquals (2, (long) lifted.apply (Option.some (1)). get ()); assertTrue (lifted.apply (Option.none ()). isEmpty ());

To je užitočné, keď chceme odovzdať funkciu, o ktorej nevie Možnosť na nejakú metódu, ktorá používa Možnosť.

Všimnite si, že rovnako ako mapa metóda, výťah nemapuje null na Žiadne:

assertEquals (null, lifted.apply (Option.some (0)). get ());

4. Buď pre výpočty s dvoma možnými výsledkami

Ako sme videli, Možnosť trieda nám umožňuje funkčné riešenie absencie hodnoty.

Niekedy však musíme vrátiť viac informácií ako „žiadna hodnota“; napríklad môžeme chcieť vrátiť buď legitímnu hodnotu, alebo chybový objekt.

The Buď trieda pokrýva tento prípad použitia.

Prípad z Buď môže byť a Správny alebo a Vľavo, ale nikdy nie obaja súčasne.

Podľa konvencie je pravá časť výsledkom úspešného výpočtu, zatiaľ čo ľavá predstavuje výnimočný prípad.

4.1. Stavba Buď

Môžeme získať Buď napríklad zavolaním jednej z jeho dvoch statických výrobných metód.

Voláme správny ak chceme Buď obsahujúci Správny hodnotu:

Buď vpravo = Buď.správne ("hodnota");

Inak voláme vľavo:

Buď vľavo = Buď.vľavo (-1);

Tu môže náš výpočet vrátiť buď a String alebo an Celé číslo.

4.2. Pomocou Buď

Keď máme Buď Napríklad môžeme skontrolovať, či je to vľavo alebo vpravo, a podľa toho konať:

if (either.isRight ()) {...}

Zaujímavejšie je, že môžeme reťaziť operácie pomocou funkčného štýlu:

buď .map (String :: toUpperCase) .getOrNull ();

4.3. Projekcie

Hlavná vec, ktorá sa líši buď od iných monadických nástrojov, ako je Možnosť, Vyskúšať, je skutočnosť, že je to často nestranné. Jednoducho povedané, ak zavoláme metódu map (), Buď nevie, s kym pracovat Vľavo alebo Správny strane.

Tu prichádzajú vhod projekcie.

Ľavá a pravá projekcia sú zrkadlové pohľady na Buď ktoré sa zameriavajú na ľavú alebo pravú hodnotu, v uvedenom poradí:

either.left () .map (x -> decodeSQLErrorCode (x));

Vo vyššie uvedenom útržku kódu, ak Buď je Vľavo, decodeSQLErrorCode () sa použije na podkladový prvok. Ak Buď je Správny, nebude. To isté platí aj pri použití správnej projekcie.

4.4. Úžitkové metódy

Ako s možnosti, Fugue poskytuje triedu plnú nástrojov pre Eithers, a tiež sa to volá takto: Eithers.

Obsahuje metódy filtrovania, prenášania a iterácie nad zbierkami súborov Buďs.

5. Spracovanie výnimiek pomocou Vyskúšajte

Naše turné po typoch údajov typu ten-ten-ten vo Fugue uzatvárame inou variáciou, ktorá sa volá Vyskúšajte.

Vyskúšajte je podobný Buď, ale líši sa tým, že je určený na prácu s výnimkami.

Páči sa mi to Možnosť a na rozdiel od Buď, Vyskúšajte je parametrizovaný cez jeden typ, pretože „iný“ typ je pevne nastavený na Výnimka (zatiaľ čo Možnosť je to implicitne Neplatný).

Takže, a Vyskúšajte môže byť buď a Úspech alebo a Zlyhanie:

assertTrue (Try.failure (new Exception ("Fail!")). isFailure ()); assertTrue (Try.successful ("OK"). isSuccess ());

5.1. Vytvorenie inštancie a Vyskúšajte

Často nebudeme vytvárať a Vyskúšajte výslovne ako úspech alebo neúspech; namiesto toho vytvoríme jeden z volania metódy.

Skontrolované zavolá danú funkciu a vráti a Vyskúšajte zapuzdrenie jeho návratovej hodnoty alebo akejkoľvek vyvolanej výnimky:

assertTrue (Checked.of (() -> "ok"). isSuccess ()); assertTrue (Checked.of (() -> {throw new Exception ("ko");}). isFailure ());

Ďalšia metóda, Checked.lift, berie funkciu potenciálneho hádzania a výťahy to na funkciu vracajucu a Vyskúšajte:

Checked.Function throwException = (String x) -> {throw new Exception (x); }; assertTrue (Checked.lift (throwException) .apply ("ko"). isFailure ());

5.2. Pracujúci s Vyskúšajte

Keď už máme Vyskúšajte, tri najčastejšie veci, ktoré by sme s tým nakoniec mohli chcieť urobiť, sú:

  1. ťažba jeho hodnoty
  2. zreťazenie niektorých operácií na úspešnú hodnotu
  3. spracovanie výnimky s funkciou

Okrem toho, samozrejme, odhodenie Vyskúšajte alebo ich odovzdaním iným metódam, vyššie uvedené tri nie sú jedinými možnosťami, ktoré máme, ale všetky ostatné vstavané metódy sú iba pohodlnosťou týchto troch.

5.3. Získanie úspešnej hodnoty

Na extrahovanie hodnoty používame getOrElse metóda:

assertEquals (42, failed Try.getOrElse (() -> 42));

Vráti úspešnú hodnotu, ak je prítomná, alebo inak vypočítanú hodnotu.

Nie je getOrThrow alebo podobné, ale od getOrElse nechytá nijakú výnimku, môžeme ju ľahko napísať:

some Try.getOrElse (() -> {throw new NoSuchElementException ("Nothing to get");});

5.4. Prepojenie hovorov po úspechu

Vo funkčnom štýle môžeme použiť funkciu na hodnotu úspechu (ak je prítomná) bez toho, aby sme ju najskôr výslovne extrahovali.

Toto je typické mapa metóda, ktorú nájdeme v Možnosť, Buď a väčšina ostatných kontajnerov a zbierok:

Try a Try = Try.successful (42) .map (x -> x + 1);

Vracia a Vyskúšajte aby sme mohli reťaziť ďalšie operácie.

Samozrejme, máme aj flatMap odroda:

Try.successful (42) .flatMap (x -> Try.su successful (x + 1));

5.5. Obnova z výnimiek

Máme analogické mapovacie operácie, ktoré fungujú s výnimkou a Vyskúšajte (ak je prítomný), a nie jeho úspešná hodnota.

Tieto metódy sa však líšia v tom, aký majú význam zotaviť sa z výnimky, t. j. vyrobiť úspešný Vyskúšajte v predvolenom prípade.

Môžeme teda vyrobiť novú hodnotu pomocou zotaviť sa:

Try recover = Try .failure (new Exception ("boo!")) .Recover ((Exception e) -> e.getMessage () + "recovered."); assertTrue (recover.isSuccess ()); assertEquals ("boo! obnovené.", recover.getOrElse (() -> null));

Ako vidíme, funkcia obnovenia berie ako jediný argument výnimku.

Ak samotná funkcia obnovenia hodí, výsledkom je ďalší neúspech Vyskúšajte:

Try failure = Try.failure (new Exception ("boo!")). Recover (x -> {throw new RuntimeException (x);}); assertTrue (failure.isFailure ());

Analogicky k flatMap sa volá zotaviť sa:

Try recover = Try .failure (new Exception ("boo!")) .RecoverWith ((Exception e) -> Try.su successful ("obnovený znova!")); assertTrue (recover.isSuccess ()); assertEquals ("znova obnovené!", recover.getOrElse (() -> null));

6. Ostatné nástroje

Poďme sa teraz krátko pozrieť na niektoré z ďalších nástrojov vo fúge, skôr ako to zabalíme.

6.1. Páry

A Pár je skutočne jednoduchá a všestranná dátová štruktúra zložená z dvoch rovnako dôležitých komponentov, ktoré Fugue nazýva vľavo a správny:

Párový pár = Pair.pair (1, "a"); assertEquals (1, (int) pair.left ()); assertEquals ("a", pair.right ());

Fuga neposkytuje veľa vstavaných metód Párs, okrem mapovania a aplikovateľného funktorového vzoru.

Avšak Párs sa používajú v celej knižnici a sú ľahko dostupné pre užívateľské programy.

Ďalšia implementácia Lispu do chudobnej osoby je len pár stlačení kláves!

6.2. Jednotka

Jednotka je enum s jedinou hodnotou, ktorá má predstavovať „žiadnu hodnotu“.

Je to náhrada za neplatný návratový typ a Neplatný triedy, to končí nulový:

Jednotka doSomething () {System.out.println ("Dobrý deň! Vedľajší efekt"); návratová jednotka (); }

Celkom prekvapivo však Možnosť nerozumie Jednotka, zaobchádza s tým ako s určitou hodnotou namiesto so žiadnou.

6.3. Statické nástroje

Máme niekoľko tried nabitých statickými úžitkovými metódami, ktoré nebudeme musieť písať a testovať.

The Funkcie trieda ponúka metódy, ktoré využívajú a transformujú funkcie rôznymi spôsobmi: zloženie, aplikácia, kari, použitie čiastkových funkcií Možnosť, slabá memoizácia atď.

The Dodávatelia trieda poskytuje podobnú, ale obmedzenejšiu zbierku nástrojov pre server Dodávateľs, teda funkcie bez argumentov.

Iterables a Iterátorykonečne obsahujú rad statických metód na manipuláciu s týmito dvoma široko používanými štandardnými rozhraniami Java.

7. Záver

V tomto článku sme poskytli prehľad knižnice Fugue od spoločnosti Atlassian.

Nedotkli sme sa algebricky ťažkých tried Monoidné a Poloskupiny pretože sa nezmestia do všeobecného článku.

Môžete si však o nich a ešte viac prečítať v javadocs a zdrojovom kóde Fugue.

Taktiež sme sa nedotkli žiadneho z voliteľných modulov, ktoré ponúkajú napríklad integráciu s Guava a Scala.

Implementáciu všetkých týchto príkladov a útržkov kódu nájdete v projekte GitHub - jedná sa o projekt Maven, takže by malo byť ľahké ho importovať a spustiť tak, ako je.


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