Maison > Java > javaDidacticiel > le corps du texte

Comment gérer les exceptions vérifiées lors de l'utilisation d'expressions Lambda avec des flux dans Java 8 ?

DDD
Libérer: 2024-10-27 05:06:30
original
1149 Les gens l'ont consulté

How to Handle Checked Exceptions When Using Lambda Expressions with Streams in Java 8?

Java 8 : Lambda-Streams, filtration par méthode avec gestion des exceptions

En Java 8, les expressions lambda dans les flux filtrent efficacement les éléments. Cependant, lorsqu'il s'agit de méthodes qui génèrent des exceptions vérifiées comme IOException, des complications peuvent survenir.

L'extrait de code suivant illustre ce problème :

<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 car il ne peut pas gérer le IOException levée par les méthodes isActive et getNumber dans les expressions lambda.

Pour résoudre ce problème, nous devons intercepter l'exception avant qu'elle n'échappe au lambda :

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

Comme le lambda est évalué dans un contexte différent où l'exception vérifiée n'est pas déclarée, nous enveloppons l'exception vérifiée dans une exception non vérifiée.

Vous pouvez également utiliser une méthode qui désamorce la vérification des exceptions du compilateur :

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

Où uncheckCall est défini comme :

<code class="java">public static <T> T uncheckCall(Callable<T> callable) {
    try {
        return callable.call();
    } catch (Exception e) {
        sneakyThrow(e);
        return null; // Unreachable but needed to satisfy compiler
    }
}</code>
Copier après la connexion

Cette méthode convertit efficacement les exceptions vérifiées en exceptions non vérifiées. Cependant, il doit être utilisé avec prudence, car il peut entraîner un comportement inattendu s'il n'est pas géré correctement.

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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal