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
821 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!

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