Maison > Java > javaDidacticiel > Comment implémenter l'équivalent de Java 8 de « takeWhile » de Java 9 pour les flux ?

Comment implémenter l'équivalent de Java 8 de « takeWhile » de Java 9 pour les flux ?

DDD
Libérer: 2024-12-19 21:17:10
original
934 Les gens l'ont consulté

How to Implement Java 8's Equivalent of Java 9's `takeWhile` for Streams?

Java 8 Stream : Limitation par prédicat

Dans les scénarios avec des flux potentiellement infinis, nous rencontrons souvent la nécessité de limiter le flux jusqu'au premier l’élément échoue à un prédicat spécifique. Java 9 a introduit l'opération utile takeWhile, permettant cette fonctionnalité sans effort.

Malheureusement, Java 8 ne dispose pas d'une telle opération. Ainsi, nous devons explorer des approches alternatives pour obtenir ce comportement.

Implémentation de takeWhile en Java 8

Pour implémenter takeWhile en Java 8, nous pouvons exploiter la stratégie suivante :

  1. Créez un itérateur à partir du flux en utilisant iterator().
  2. Parcourez l'itérateur jusqu'à ce que le prédicat échoue.
  3. Collectez les éléments filtrés dans un nouveau flux à l'aide de generate().

Vous trouverez ci-dessous un exemple d'implémentation :

import java.util.Iterator;
import java.util.stream.Stream;

public class StreamTakeWhile {

    public static <T> Stream<T> takeWhile(Stream<T> stream, java.util.function.Predicate<T> predicate) {
        Iterator<T> iterator = stream.iterator();
        return Stream.generate(() -> {
            if (iterator.hasNext() && predicate.test(iterator.next())) {
                return iterator.next();
            }
            return null;
        });
    }

    public static void main(String[] args) {
        StreamTakeWhile.takeWhile(Stream.iterate(1, n -> n + 1), n -> n < 10)
                .forEach(System.out::println);
    }
}
Copier après la connexion

Utilisation de Java 9 takeWhile

Avec Java 9, vous pouvez directement utiliser l'opération takeWhile comme indiqué ci-dessous :

IntStream
    .iterate(1, n -> n + 1)
    .takeWhile(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!

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