Heim >Java >javaLernprogramm >Wie kann ein Java 8-Stream begrenzt werden, bis ein Prädikat fehlschlägt?

Wie kann ein Java 8-Stream begrenzt werden, bis ein Prädikat fehlschlägt?

Barbara Streisand
Barbara StreisandOriginal
2024-12-20 17:59:10567Durchsuche

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

Begrenzen eines Streams basierend auf einem Prädikat in Java 8

Java 8-Stream-Operationen bieten eine leistungsstarke Möglichkeit, Daten zu bearbeiten und zu filtern. Es fehlt jedoch eine spezifische Operation, um einen potenziell unendlichen Stream zu begrenzen, bis das erste Element ein bestimmtes Prädikat nicht erfüllt.

In Java 9 kann die takeWhile-Operation verwendet werden, um dieses Verhalten zu erreichen. Um beispielsweise alle Zahlen kleiner als 10 mit takeWhile auszugeben, können Sie Folgendes schreiben:

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

Aber was ist mit Java 8, wo takeWhile nicht verfügbar ist? In diesem Fall gibt es mehrere Ansätze, ähnliche Funktionen zu implementieren.

Eine Möglichkeit besteht darin, die Filter- und findFirst-Operationen zu verwenden. Der folgende Codeausschnitt zeigt, wie:

IntStream
    .iterate(1, n -> n + 1)
    .filter(n -> n < 10)
    .findFirst()
    .ifPresent(System.out::println);

Diese Lösung funktioniert, indem sie Elemente herausfiltert, die das Prädikat nicht erfüllen (in diesem Fall Zahlen größer oder gleich 10), und dann das erste verbleibende Element darin findet der Strom. Wenn kein passendes Element gefunden wird, gibt findFirst ein leeres optionales Element zurück, das in diesem Fall ignoriert wird.

Ein anderer Ansatz verwendet eine benutzerdefinierte Stream.limitUntil-Methode, die ein Prädikat als Argument verwendet. Hier ist eine Beispielimplementierung:

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

Diese Methode kann wie folgt verwendet werden:

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

Das obige ist der detaillierte Inhalt vonWie kann ein Java 8-Stream begrenzt werden, bis ein Prädikat fehlschlägt?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn