Maison > Java > javaDidacticiel > Comment gérer les exceptions dans les expressions Java 8 Lambda lors du filtrage des flux ?

Comment gérer les exceptions dans les expressions Java 8 Lambda lors du filtrage des flux ?

Patricia Arquette
Libérer: 2024-10-26 04:54:03
original
885 Les gens l'ont consulté

How to Handle Exceptions in Java 8 Lambda Expressions When Filtering Streams?

Java 8 : Lambda-Streams - Filtrage par méthode qui génère des exceptions

Les expressions lambda de Java 8 offrent des moyens puissants de manipuler et de traiter les données. Cependant, lorsqu'il s'agit de méthodes capables de lever des exceptions, il est important de connaître les limites des expressions lambda et d'explorer des solutions efficaces.

Le problème :

Considérez le code suivant fragment :

<code class="java">class Bank {
    public Set<String> getActiveAccountNumbers() throws IOException {
        Stream<Account> s = accounts.values().stream();
        s = s.filter(a -> a.isActive());
        Stream<String> ss = s.map(a -> a.getNumber());
        return ss.collect(Collectors.toSet());
    }
}

interface Account {
    boolean isActive() throws IOException;
    String getNumber() throws IOException;
}</code>
Copier après la connexion

Ce code ne parvient pas à se compiler en raison des exceptions vérifiées levées par les méthodes isActive et getNumber. Il ne suffit pas de simplement intercepter les exceptions dans un bloc try-catch environnant, car les exceptions ne sont pas correctement gérées dans les expressions lambda.

La solution :

Pour surmonter ce problème, nous devons intercepter les exceptions avant qu'elles échappent à l'expression lambda. Une approche consiste à utiliser une exception non vérifiée, comme le montre le fragment de code modifié suivant :

<code class="java">s = s.filter(a -> {
    try {
        return a.isActive();
    } catch (IOException e) {
        throw new UncheckedIOException(e);
    }
});</code>
Copier après la connexion

Ici, nous captons l'exception IOException dans le lambda et lançons une exception non vérifiée, garantissant qu'elle est correctement gérée dans le lambda. expression.

Alternativement, nous pouvons utiliser une méthode wrapper qui traduit les exceptions vérifiées en exceptions non vérifiées :

<code class="java">return s.filter(a -> uncheckCall(a::isActive))
        .map(Account::getNumber)
        .collect(toSet());

public static <T> T uncheckCall(Callable<T> callable) {
    try {
        return callable.call();
    } catch (RuntimeException e) {
        throw e;
    } catch (Exception e) {
        throw new RuntimeException(e);
    }
}</code>
Copier après la connexion

Cela nous permet d'envelopper l'expression lambda dans un appel à uncheckCall, qui gère le vérifié les exceptions en interne, laissant l'expression lambda libre de déclarations d'exception vérifiées.

Autres considérations :

Il est important d'être conscient du fait que certaines exceptions peuvent toujours échapper au expression lambda, même avec les solutions suggérées. Par exemple, les exceptions levées lors de l'évaluation de l'opération de collecte se propageront toujours hors du lambda.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal