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
Freigeben: 2024-12-20 17:59:10
Original
516 Leute haben es durchsucht

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);
Nach dem Login kopieren

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);
Nach dem Login kopieren

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;
    });
}
Nach dem Login kopieren

Diese Methode kann wie folgt verwendet werden:

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

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!

Quelle:php.cn
Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage