Maison > Java > javaDidacticiel > Comment limiter un flux Java 8 jusqu'à ce qu'un prédicat échoue ?

Comment limiter un flux Java 8 jusqu'à ce qu'un prédicat échoue ?

Barbara Streisand
Libérer: 2024-12-20 17:59:10
original
516 Les gens l'ont consulté

How to Limit a Java 8 Stream Until a Predicate Fails?

Limitation d'un flux basé sur un prédicat dans Java 8

Les opérations de flux Java 8 offrent un moyen puissant de manipuler et de filtrer les données. Cependant, il lui manque une opération spécifique pour limiter un flux potentiellement infini jusqu'à ce que le premier élément échoue à un prédicat donné.

Dans Java 9, l'opération takeWhile peut être utilisée pour obtenir ce comportement. Par exemple, pour imprimer tous les nombres inférieurs à 10 en utilisant takeWhile, vous pouvez écrire :

IntStream
    .iterate(1, n -> n + 1)
    .takeWhile(n -> n < 10)
    .forEach(System.out::println);
Copier après la connexion

Mais qu'en est-il de Java 8, où takeWhile n'est pas disponible ? Dans ce cas, il existe plusieurs approches pour implémenter des fonctionnalités similaires.

Une méthode consiste à utiliser les opérations filter et findFirst. L'extrait de code suivant montre comment :

IntStream
    .iterate(1, n -> n + 1)
    .filter(n -> n < 10)
    .findFirst()
    .ifPresent(System.out::println);
Copier après la connexion

Cette solution fonctionne en filtrant les éléments qui ne répondent pas au prédicat (dans ce cas, les nombres supérieurs ou égaux à 10), puis en recherchant le premier élément restant dans le ruisseau. Si aucun élément correspondant n'est trouvé, findFirst renvoie un facultatif vide, qui est ignoré dans ce cas.

Une autre approche utilise une méthode Stream.limitUntil personnalisée, qui prend un prédicat comme argument. Voici un exemple d'implémentation :

public static <T> Stream<T> limitUntil(Stream<T> stream, Predicate<? super T> predicate) {
    AtomicBoolean stop = new AtomicBoolean(false);
    return stream.takeWhile(t -> {
        boolean stopFlag = stop.get();
        if (!stopFlag) stopFlag = predicate.test(t);
        stop.set(stopFlag);
        return !stopFlag;
    });
}
Copier après la connexion

Cette méthode peut être utilisée comme suit :

IntStream
    .iterate(1, n -> n + 1)
    .limitUntil(n -> n >= 10)
    .forEach(System.out::println);
Copier après la connexion

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