Introduction à Vavr soit

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 découvrirons l 'outil de Vavr appelé Either. Si vous souhaitez en savoir plus sur la bibliothèque Vavr , consultez cet article.

2. Qu'est-ce que l'un ou l'autre ?

Dans un monde de programmation fonctionnelle, les valeurs ou objets fonctionnels ne peuvent pas être modifiés (c'est-à-dire sous forme normale); dans la terminologie Java, on parle de variables immuables.

Soit représente une valeur de deux types de données possibles. Un Soit est soit une gauche, soit une droite . Par convention, la gauche signifie un résultat de cas d'échec et la droite signifie un succès.

3. Dépendances de Maven

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

 io.vavr vavr 0.9.0 

La dernière version de Vavr est disponible dans le référentiel central de Maven.

4. Cas d'utilisation

Considérons 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 une chaîne, soit un entier .

4.1. Java simple

Nous pouvons mettre en œuvre cela 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 liste / tableau de taille fixe 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 deuxième 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 nous pouvons le voir, les deux méthodes nécessitent beaucoup de travail et le résultat final n'est pas très esthétique ni sûr à utiliser.

4.2. Avec l'un ou l'autre

Maintenant , nous allons voir comment nous pouvons utiliser Vavr de » Soit l'utilité 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); } } 

Non, la conversion de type explicite, la vérification des valeurs nulles ou la création d'objets inutilisés sont requises.

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' attribut Left de Either représente un cas d'échec et celui de droite représente un succès. Cependant, en fonction de nos besoins, nous pouvons changer cela en utilisant des projections - Soit dans Vavr n'est pas biaisé vers la gauche ou la droite.

Si nous projetons vers la droite, des opérations comme filter (), map () n'auront aucun effet si l'un ou l'autre était à gauche.

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

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

S'il s'avère que nous avons projeté de gauche à droite, nous obtiendrons immédiatement une liste vide.

Nous pouvons interagir avec la projection de gauche 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 utilitaires l'un ou l'autre disponibles; jetons un coup d'œil à certains d'entre eux.

Nous pouvons vérifier si un Either ne contient que Left ou Right en utilisant les méthodes isLeft et isRight :

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

Nous pouvons vérifier si Either contient une valeur Right donnée :

result.contains(100)

Nous pouvons plier gauche et droite en un type commun:

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

ou… même changer de côté:

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

5. Conclusion

Dans ce rapide tutoriel, nous avons appris à utiliser l' utilitaire Either du framework de Vavr . Plus de détails sur l'un ou l'autre peuvent être trouvés ici.

Comme toujours, le code source complet est disponible à l'adresse over sur GitHub.