Stream<T>
basiert auf dem internen Iterationsansatz von Spliterator<T>
, der wiederum die Iteration auf boolean tryAdvance(Consumer<? super T> action)
Implementierung delegiert. Legen Sie es einfach:Einfachste Möglichkeit, einen Stream aus einer Funktion zu erstellen
Stream<T>
---->
Spliterator<T>
---->
boolean tryAdvance(Consumer<T>)
Also, ich möchte eine Art von Programm haben, die eine Stream<T>
von einem Function<Consumer<T>, Boolean>
erstellen können. Man beachte, dass Function<Consumer<T>, Boolean>
den gleichen Deskriptor boolean tryAdvance(Consumer<T>)
, d. H. Consumer<T> -> Boolean
, hat.
Ich bin für eine Hilfsfunktion wie (aktualisiert nach @ shmosel des comment):
static <T> Stream<T> stream(Predicate<Consumer<? super T>> moveNext) {
Spliterator<T> iter = new AbstractSpliterator<T>(Long.MAX_VALUE, 0) {
@Override
public boolean tryAdvance(Consumer<? super T> action) {
return moveNext.test(action);
}
};
return StreamSupport.stream(iter, false);
}
Dies ist die prägnante Art und Weise, die ich, dass die Umsetzung erreichen gefunden. Dennoch mag ich den Gebrauch der anonymen inneren Klasse immer noch nicht. Gibt es eine einfachste Alternative?
Ich weiß nicht, ob das möglich ist, aber gibt es einen Grund für diese Anforderung? Vielleicht, was du willst, kann man anders herum erreichen. –
@ JoãoRebelo Es gibt viele Abfragemethoden, die nicht in der Original-Stream-API enthalten sind, wie 'takeWhile',' zip' usw. Wenn Sie also DIY erstellen und eine fehlende Methode hinzufügen wollen, müssen Sie über 'Iterator' oder 'Spliterator' und wandle es zurück in' Stream' –
zB [Einen Stream durch ein Prädikat begrenzen] (http://stackoverflow.com/q/20746429/1140754) oder [Wie man gerade Zeilen eines Streams überspringt] (http://stackoverflow.com/q/30170089/1140754) –