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
Barbara Streisandoriginal
2024-12-20 17:59:10517parcourir

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);

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);

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;
    });
}

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

IntStream
    .iterate(1, n -> n + 1)
    .limitUntil(n -> n >= 10)
    .forEach(System.out::println);

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!

Déclaration:
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