Introduction à Soit Vavr

Introduction à Soit Vavr

1. Vue d'ensemble

Vavr est une bibliothèque d'extension de langage fonctionnel objet open source pour Java 8+. Cela aide à réduire la quantité de code et à augmenter la robustesse.

Dans cet article, nous allons découvrir l'outil deVavr appeléEither. Si vous souhaitez en savoir plus sur la bibliothèqueVavr,check this article.

2. Qu'est-ce queEither?

Dans un monde de programmation fonctionnelle, lesvalues or objectsfonctionnels ne peuvent pas être modifiés (c.-à-d. ennormal form); dans la terminologie Java, on parle de variablesimmutable.

Either représente une valeur de deux types de données possibles. UnEither est soit unLeft soit unRight. Par convention, leLeft signifie un résultat de cas d'échec et leRight signifie un succès.

3. Dépendances Maven

Nous devons ajouter la dépendance suivante dans lespom.xml:


    io.vavr
    vavr
    0.9.0

La dernière version deVavr est disponible dans lesCentral Maven Repository.

4. Cas d'utilisation

Prenons un cas d’utilisation où nous devons créer une méthode qui prend une entrée et, en fonction de l’entrée, nous retournerons soit unString, soit unInteger.

4.1. Java simple

Nous pouvons mettre cela en œuvre de deux manières. Soit notre méthode peut retourner une carte avec la clé représentant le résultat de succès / échec, soit elle peut renvoyer une taille fixeList/Array où la position désigne un type de résultat.

Voici à quoi cela pourrait ressembler:

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");
}

Pour la seconde approche, nous pourrions utiliser le code suivant:

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;
}

Comme on peut le constater, les deux méthodes nécessitent beaucoup de travail et le résultat final n’est ni très attrayant du point de vue esthétique ni sûr à utiliser.

4.2. AvecEither

Voyons maintenant comment nous pouvons utiliser l'utilitaireEither deVavr pour obtenir le même résultat:

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

Aucune opération de transtypage de type, de vérification NULL ou non utilisée explicite n'est requise.

De plus,Either fournit une API de type monadique très pratique pour traiter les deux cas:

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

Par convention, l'attributEither’s Left représente un cas d'échec et celuiRight représente un succès. Cependant, en fonction de nos besoins, nous pouvons changer cela en utilisant des projections -Either enVavr n'est pas biaisé versLeft ouRight.

Si nous projetons surRight, les opérations commefilter(), map() n'auront aucun effet siEither était La gauche.

Par exemple, créons la projectionRight et définissons quelques opérations dessus:

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

S'il s'avère que nous avons projetéLeft sur lesRight,, nous obtiendrons immédiatement une liste vide.

Nous pouvons interagir avec la projectionLeft de la même manière:

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

4.3. Caractéristiques supplémentaires __

Il existe de nombreux utilitairesEither disponibles; jetons un coup d'œil à certains d'entre eux.

Nous pouvons vérifier si unEither contient uniquementLeft ouRight en utilisant les méthodesisLeft etisRight:

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

Nous pouvons vérifier siEither contient une valeurRight donnée:

result.contains(100)

Nous pouvonsfold Gauche et Droite vers un type commun:

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

ou… même échanger des côtés:

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

5. Conclusion

Dans ce rapide didacticiel, nous avons appris à utiliser l'utilitaireEither du framework deVavr. Plus de détails surEither peuvent être trouvéshere.

Comme toujours, le code source complet est disponibleover on GitHub.