Einführung in Vavrs Entweder

Einführung in Vavrs Entweder

1. Überblick

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

In diesem Artikel erfahren Sie mehr über das ToolVavrvonEither.. Wenn Sie mehr über die Bibliothek vonVavrerfahren möchten, erfahren Sie mehr übercheck this article.

2. Was istEither?

In einer funktionalen Programmierwelt können funktionalevalues or objects nicht modifiziert werden (d. H. innormal form); In der Java-Terminologie werden diese alsimmutable-Variablen bezeichnet.

Either repräsentiert einen Wert von zwei möglichen Datentypen. EinEither ist entweder einLeft oder einRight. Konventionell bedeutetLeft ein Fehlerfallergebnis undRight bedeutet Erfolg.

3. Maven-Abhängigkeiten

Wir müssen die folgende Abhängigkeit inpom.xml hinzufügen:


    io.vavr
    vavr
    0.9.0

Die neueste Version vonVavr ist inCentral 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 entwederString oderInteger 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 feste GrößeList/Array 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, sind beide Methoden sehr arbeitsintensiv und das Endergebnis ist weder ästhetisch ansprechend noch sicher in der Anwendung.

4.2. MitEither

Nun wollen wir sehen, wie wir das DienstprogrammEithervonVavrverwenden können, 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 Erstellung nicht verwendeter Objekte erforderlich.

Darüber hinaus bietetEither eine sehr praktische monadisch-ähnliche API für beide Fälle:

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

Gemäß der Konvention repräsentiert das AttributEither’s Lefteinen Fehlerfall und das AttributRighteinen Erfolg. Basierend auf unseren Anforderungen können wir dies jedoch mithilfe von Projektionen ändern -Either inVavr ist nicht aufLeft oderRight. ausgerichtet

Wenn wir aufRight, projizieren, haben Operationen wiefilter(), map() keine Auswirkung, wennEither war Links.

Lassen Sie uns beispielsweise die Projektion vonRighterstellen und einige Operationen darauf definieren:

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

Wenn sich herausstellt, dass wirLeft aufRight, projiziert haben, erhalten wir sofort eine leere Liste.

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

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

4.3. Zusatzfunktionen __

Es sind viele Dienstprogramme vonEitherverfügbar. Schauen wir uns einige davon an.

Wir können überprüfen, ob einEither nurLeft oderRight enthält, indem wir die MethodenisLeft undisRight verwenden:

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

Wir können überprüfen, obEither einen bestimmtenRight-Wert enthält:

result.contains(100)

Wir könnenfold links und rechts zu einem gemeinsamen Typ machen:

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. Fazit

In diesem kurzen Tutorial haben wir gelernt, wie Sie das DienstprogrammEitherdes FrameworksVavrverwenden. Weitere Details zuEither finden Sie unterhere.

Wie immer ist der vollständige Quellcodeover on GitHub verfügbar.