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!