Inleiding tot Vavr's Ofwel

1. Overzicht

Vavr is een open source objectfunctionele taaluitbreidingsbibliotheek voor Java 8+. Het helpt de hoeveelheid code te verminderen en de robuustheid te vergroten.

In dit artikel zullen we meer leren over Vavr‘S tool genaamd Een van beide. Als u meer wilt weten over het Vavr bibliotheek, bekijk dan dit artikel.

2. Wat is Een van beide?

In een functionele programmeerwereld functioneel waarden of objecten kan niet worden gewijzigd (d.w.z. in normale vorm); in Java-terminologie staat het bekend als onveranderlijke variabelen.

Beide vertegenwoordigen een waarde van twee mogelijke gegevenstypen. Een Een van beide is ofwel een Links of een Rechtsaf. Volgens afspraak is het Links geeft het resultaat van een foutgeval aan en de Rechtsaf betekent een succes.

3. Maven afhankelijkheden

We moeten de volgende afhankelijkheid toevoegen in het pom.xml:

 io.vavr vavr 0.9.0 

De nieuwste versie van Vavr is beschikbaar in de Central Maven Repository.

4. Gebruik gevallen

Laten we eens kijken naar een use-case waarin we een methode moeten maken die een invoer nodig heeft en, op basis van de invoer, een Draad of een Geheel getal.

4.1. Gewoon Java

We kunnen dit op twee manieren implementeren. Ofwel onze methode kan een kaart retourneren met de sleutel die het resultaat van succes / mislukking vertegenwoordigt, of het kan een vaste grootte retourneren Lijst / matrix waarbij positie een resultaattype aangeeft.

Dit is hoe dit eruit zou kunnen zien:

openbare statische kaart computeWithoutEitherUsingMap (int marks) {Map results = new HashMap (); if (markeert <85) {results.put ("FAILURE", "Marks niet acceptabel"); } else {results.put ("SUCCESS", marks); } resultaten retourneren; } public static void main (String [] args) {Map results = computeWithoutEitherUsingMap (8); String error = (String) results.get ("FAILURE"); int marks = (int) results.get ("SUCCESS"); }

Voor de tweede benadering zouden we de volgende code kunnen gebruiken:

openbaar statisch Object [] computeWithoutEitherUsingArray (int marks) {Object [] resultaten = nieuw Object [2]; if (marks <85) {results [0] = "Marks niet acceptabel"; } anders {resultaten [1] = punten; } resultaten retourneren; }

Zoals we kunnen zien, vereisen beide manieren nogal wat werk, en het eindresultaat is niet erg esthetisch aantrekkelijk en ook niet veilig in gebruik.

4.2. Met Een van beide

Laten we nu eens kijken hoe we het kunnen gebruiken Vavr‘S Een van beide hulpprogramma om hetzelfde resultaat te bereiken:

private static Ofwel computeWithEither (int marks) {if (marks <85) {return Either.left ("Marks niet acceptabel"); } else {retourneer Ofwel.right (marks); }} 

Nee, expliciete typecasting, null-controle of het maken van ongebruikte objecten is vereist.

Bovendien, Een van beide biedt een zeer handige monadisch-achtige API voor het omgaan met beide gevallen:

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

Volgens afspraak, Ofwel is links attribuut staat voor een storing en het Rechtsaf één vertegenwoordigt een succes. Op basis van onze behoeften kunnen we dit echter veranderen met behulp van projecties - Een van beide in Vavr is niet bevooroordeeld Links of Rechtsaf.

Als we projecteren Rechtsaf, operaties zoals filter (), kaart () zal geen effect hebben als Een van beide was Links.

Laten we bijvoorbeeld het Rechtsaf projectie en definieer er enkele bewerkingen op:

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

Als blijkt dat we hebben geprojecteerd Links naar de Rechtsaf, we krijgen onmiddellijk een lege lijst.

We kunnen communiceren met de Links projectie op een vergelijkbare manier:

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

4.3. Extra functies

Er zijn genoeg van Een van beide hulpprogramma's beschikbaar; laten we er een paar bekijken.

We kunnen controleren of een Een van beide bevatten alleen Links of Rechtsaf gebruik makend van isLinks en heeft gelijk methoden:

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

We kunnen kijken of Een van beide bevat een gegeven Rechtsaf waarde:

resultaat. bevat (100)

Wij kunnen vouwen Links en rechts naar één algemeen type:

Ofwel ofwel = ofwel. Rechts (42); String resultaat = of.fold (i -> i, Object :: toString);

of ... zelfs van kant wisselen:

Ofwel ofwel = ofwel. Rechts (42); Ofwel swap = ofwel.swap ();

5. Conclusie

In deze korte tutorial hebben we geleerd over het gebruik van de Een van beide nut van Vavr'S raamwerk. Meer details over Een van beide vind je hier.

Zoals altijd is de volledige broncode beschikbaar op GitHub.