Stream<T>
はSpliterator<T>
によって提供される内部反復アプローチに基づいており、次にboolean tryAdvance(Consumer<? super T> action)
実装で反復を委任します。シンプルなそれを置く:関数からのストリームを作成する最も簡単な方法
Stream<T>
---->
Spliterator<T>
---->
boolean tryAdvance(Consumer<T>)
だから、私はFunction<Consumer<T>, Boolean>
からStream<T>
を作成することを可能にするユーティリティのいくつかの並べ替えを持っていると思います。 Function<Consumer<T>, Boolean>
はboolean tryAdvance(Consumer<T>)
と同じ記述子を持ちます。つまり、Consumer<T> -> Boolean
です。
私は、このような(@ shmoselの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);
}
これは私がその実現を達成するために見出される最も簡潔な方法です。しかし、私はまだ匿名の内部クラスの使用が嫌いです。最も簡単な選択肢はありますか?
私はそれが可能かもしれないかどうかは知っていませんが、その要件の理由はありますか?おそらくあなたが望むものは、別の方法で達成されるかもしれません。 –
@JoãoRebeloオリジナルのStream APIでは 'takeWhile'、' zip'などのように多くのクエリメソッドが用意されていますので、DIYや欠けているメソッドを追加したいときは 'Iterator'や'Spliterator'を呼び出して' Stream'に戻します –
[述語でストリームを制限する](http://stackoverflow.com/q/20746429/1140754)または[ストリームの偶数行をスキップする方法](http://stackoverflow.com/q/30170089/1140754) –