Exceptions dans l’expression Lambda avec Vavr

Exceptions dans l'expression lambda à l'aide de Vavr

1. introduction

LesFunctional Interfaces fournis par le JDK ne sont pas préparés correctement pour le traitement des exceptions vérifiées. Si vous voulez en savoir plus sur le problème, cochezthis article.

Dans cet article, nous allons examiner différentes manières de résoudre ces problèmes en utilisant la bibliothèque fonctionnelle JavaVavr.

Pour obtenir plus d'informations sur Vavr et comment le configurer, consultezthis article.

2. Utilisation deCheckedFunction

Vavr fournit desfunctional Interfaces qui ont des fonctions qui lèvent des exceptions vérifiées. Ces fonctions sontCheckedFunction0,CheckedFunction1 et ainsi de suite jusqu'àCheckedFunction8. Les0, 1, … 8 à la fin du nom de la fonction indiquent le nombre d'arguments d'entrée pour la fonction.

Voyons un exemple:

static Integer readFromFile(Integer integer) throws IOException {
    // logic to read from file which throws IOException
}

Nous pouvons utiliser la méthode ci-dessus dans une expression lambda sans gérer lesIOException:

List integers = Arrays.asList(3, 9, 7, 0, 10, 20);

CheckedFunction1 readFunction = i -> readFromFile(i);
integers.stream()
 .map(readFunction.unchecked());

Comme vous pouvez le voir, sans lestry-catch standard ou les méthodes wrapper, nous pouvons toujours appeler des méthodes de lancement d'exceptions dans une expression lambda.

Nous devons faire preuve de prudence lors de l'utilisation de cette fonctionnalité avec l'APIStream, car une exception mettrait immédiatement fin à l'opération - abandonnant le reste du flux.

3. Utilisation des méthodes d'assistance

La classe API fournit une méthode de raccourci pour l'exemple de la section précédente:

List integers = Arrays.asList(3, 9, 7, 0, 10, 20);

integers.stream()
  .map(API.unchecked(i -> readFromFile(i)));

4. Utilisation du levage

Pour gérer correctement unIOException, nous pouvons introduire des blocstry-catch standard dans une expression lambda. Cependant, la concision d'une expression lambda sera perdue. Le levage de Vavr vient à notre secours.

Le levage est un concept de programmation fonctionnelle. Vous pouvez élever une fonction partielle à une fonction totale qui renvoie unOption comme résultat.

Une fonction partielle est une fonction définie uniquement pour un sous-ensemble d'un domaine, par opposition à une fonction totale définie pour l'intégralité de son domaine. Si la fonction partielle est appelée avec une entrée située en dehors de la plage prise en charge, elle lève généralement une exception.

Réécrivons l'exemple de la section précédente:

List integers = Arrays.asList(3, 9, 7, 0, 10, 20);

integers.stream()
  .map(CheckedFunction1.lift(i -> readFromFile(i)))
  .map(k -> k.getOrElse(-1));

Notez que le résultat de la fonction levée estOption et le résultat seraOption.None en cas d'exception. La méthodegetOrElse() prend une autre valeur à renvoyer en cas deOption.None.

5. Utilisation deTry

Alors que la méthodelift() de la section précédente résout le problème de l'arrêt brutal du programme, elle avale en fait l'exception. Par conséquent, le consommateur de notre méthode n'a aucune idée de ce qui a entraîné la valeur par défaut. L'alternative consiste à utiliser un conteneurTry.

Try est un conteneur spécial avec lequel nous pouvons inclure une opération qui pourrait éventuellement lever une exception. Dans ce cas, l'objetTry résultant représente unFailure et il encapsule l'exception.

Regardons le code qui utiliseTry:

List integers = Arrays.asList(3, 9, 7, 0, 10, 20);
integers.stream()
  .map(CheckedFunction1.liftTry(i -> readFromFile(i)))
  .flatMap(Value::toJavaStream)
  .forEach(i -> processValidValue(i));

Pour en savoir plus sur le conteneurTry et comment l'utiliser, consultezthis article.

6. Conclusion

Dans cet article rapide, nous avons montré comment utiliser les fonctionnalités de la bibliothèque Vavr pour contourner les problèmes tout en gérant les exceptions dans les expressions lambda.

Bien que ces fonctionnalités nous permettent de gérer les exceptions avec élégance, elles doivent être utilisées avec le plus grand soin. Avec certaines de ces approches, les utilisateurs de vos méthodes peuvent être surpris par des exceptions vérifiées inattendues, bien qu'elles ne soient pas explicitement déclarées.

Le code source complet de tous les exemples de cet article se trouve àover on Github.