Einführung in Vavrs Entweder

1. Übersicht

Vavr ist eine Open Source-Bibliothek für objektfunktionale Spracherweiterungen für Java 8+. Dies hilft, die Codemenge zu reduzieren und die Robustheit zu erhöhen.

In diesem Artikel erfahren Sie mehr über das Vavr -Tool " Entweder". Wenn Sie mehr über die Vavr- Bibliothek erfahren möchten, lesen Sie diesen Artikel.

2. Was ist beides ?

In einer funktionalen Programmierwelt können funktionale Werte oder Objekte nicht geändert werden (dh in normaler Form). In der Java-Terminologie werden sie als unveränderliche Variablen bezeichnet.

Beides repräsentiert einen Wert von zwei möglichen Datentypen. Ein Entweder ist entweder ein Links oder ein Rechts . Konventionell bedeutet die Linke ein Fehlerfallergebnis und die Rechte einen Erfolg.

3. Maven-Abhängigkeiten

Wir müssen die folgende Abhängigkeit in die pom.xml einfügen :

 io.vavr vavr 0.9.0 

Die neueste Version von Vavr ist im Central Maven Repository verfügbar.

4. Anwendungsfälle

Betrachten wir einen Anwendungsfall, in dem wir eine Methode erstellen müssen, die eine Eingabe akzeptiert, und basierend auf der Eingabe entweder einen String oder eine Ganzzahl zurückgeben .

4.1. Einfaches Java

Wir können dies auf zwei Arten umsetzen. Entweder kann unsere Methode eine Karte mit dem Schlüssel zurückgeben, der das Ergebnis von Erfolg / Misserfolg darstellt, oder sie kann eine Liste / ein Array mit fester Größe zurückgeben, wobei position einen Ergebnistyp bezeichnet.

So könnte das aussehen:

public static Map computeWithoutEitherUsingMap(int marks) { Map results = new HashMap(); if (marks < 85) { results.put("FAILURE", "Marks not acceptable"); } else { results.put("SUCCESS", marks); } return results; } public static void main(String[] args) { Map results = computeWithoutEitherUsingMap(8); String error = (String) results.get("FAILURE"); int marks = (int) results.get("SUCCESS"); }

Für den zweiten Ansatz könnten wir den folgenden Code verwenden:

public static Object[] computeWithoutEitherUsingArray(int marks) { Object[] results = new Object[2]; if (marks < 85) { results[0] = "Marks not acceptable"; } else { results[1] = marks; } return results; }

Wie wir sehen können, erfordern beide Wege ziemlich viel Arbeit, und das Endergebnis ist weder sehr ästhetisch ansprechend noch sicher zu verwenden.

4.2. Mit Entweder

Nun wollen wir sehen , wie wir nutzen können Vavr ‚s Entweder Programm , um das gleiche Ergebnis zu erzielen:

private static Either computeWithEither(int marks) { if (marks < 85) { return Either.left("Marks not acceptable"); } else { return Either.right(marks); } } 

Es ist keine explizite Typumwandlung, Nullprüfung oder nicht verwendete Objekterstellung erforderlich.

Darüber hinaus bietet Both eine sehr praktische monadische API für die Behandlung beider Fälle:

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

Konventionell repräsentiert das Attribut "Links" einen Fehlerfall und das Attribut " Rechts" einen Erfolg. Allerdings basieren auf unseren Bedarf können wir dies mit Projektionen ändern - entweder in Vavr nicht in Richtung vorbelastet links oder rechts.

Wenn wir zu projizieren rechts, Operationen wie Filter () Karte () keine Auswirkung , wenn Entweder ist links.

Erstellen wir beispielsweise die richtige Projektion und definieren einige Operationen darauf:

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

Wenn sich herausstellt, dass wir von links nach rechts projiziert haben , erhalten wir sofort eine leere Liste.

Wir können auf ähnliche Weise mit der linken Projektion interagieren :

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

4.3. Zusatzfunktionen

Es gibt viele Entweder Dienstprogramme zur Verfügung; Schauen wir uns einige davon an.

Wir können überprüfen , ob ein Entweder enthält nur links oder rechts mit isLeft und Isright Methoden:

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

Wir können überprüfen, ob entweder einen bestimmten richtigen Wert enthält:

result.contains(100)

Wir können links und rechts zu einem gemeinsamen Typ falten :

Either either = Either.right(42); String result = either.fold(i -> i, Object::toString);

oder… sogar die Seiten tauschen:

Either either = Either.right(42); Either swap = either.swap();

5. Schlussfolgerung

In diesem kurzen Tutorial haben wir die Verwendung des Dienstprogramms " Entweder" des Vavr -Frameworks kennengelernt . Weitere Details zu Beide finden Sie hier.

Wie immer ist der vollständige Quellcode auf GitHub verfügbar.