2016-05-06 6 views
0

Steam.spliteratorで作成されたストリームに対して繰り返し処理できません。私は同じことについてのドキュメントを見つけることができませんでした。IterableでSteam.spliteratorで作成されたストリーム(2回目)を反復処理できません

私はfunciton引数としてIterableを持って、私は次のコードのようなストリームを介しこれを反復しています:

StreamSupport.stream(values.spliterator(), false) 

と、次の私は再びそれをやっているということが、ここで

は私がやっているものですもう1つは何も繰り返さない。私はそれをデバッグするのに多くの時間を費やし、最後にiterableを最初のリストに変換しました。

理由を知っている人はいますか?

編集:私は明確で、

ないです場合は申し訳ありませんが、私は同じ反復処理可能と以上のようにストリームを生成して、ストリームを複数回使用していませんでした。

Iterableは、MapReduceジョブのreduceから来るものです。

おかげで、 Hareendra

+0

同じイテレータオブジェクトを使用しているか、新しいイテレータオブジェクトを生成していますか? – dahui

+1

あなたは 'Stream'しか使用できませんので、' Spliterator'を一度使用することができます。その理由は – fge

+0

私はIterable(上記の例の値)を持っています。 StreamSupport.stream(values.spliterator()、false)を使用してストリームを作成しています –

答えて

0

Streamはワンショットオブジェクトです。複数回ではなく、1回だけ消費することができます。コンテンツを複数回使用したい場合は、ストリームをリストや配列、ストリーム以外のストリームに変換してから、2つの新しいストリームを作成して、その2つのことを行う必要があります。 JavaDoc of Streamクラスから

引用:

ストリームは、一度だけ(中間または末端ストリームの操作を呼び出す)に操作されなければなりません。これは、例えば、同じソースが2つ以上のパイプラインを供給する「フォークされた」ストリーム、または同じストリームの複数のトラバーサルを排除します。

+0

編集内容を参照してください –

+0

だから?少なくともあなたのタイトルは間違っています。これは 'Stream.spliterator()'を使用していることを意味します。つまり、 'values'は' Stream'なので2回使用することはできません。 – Vampire

+0

本当にありません。あなたはまだ 'Stream.splitarator()'と呼んでいると言っていますが、 'values'はストリームなのでしょうか?もしそれが 'Iterable'ならあなたの投稿を修正してください。 – Vampire

0

Spliteratorを作成するために使用しているIterableインスタンスが本当にIterable契約を尊重していることを確認してください。 iterator()を実装するものがIterableとして機能すると考えている人もいますが、そうではありません。 Iterable契約に準拠するには、iterator()を複数回呼び出すことができ、毎回繰り返し行うことができる必要があります。

iterator()の機能を持つものからIterableを作成するのは非常に簡単なので、製造されたIterableのケースをいくつか見てきました。例えば、1は、これを行うことができます:それは繰り返し処理された後falseIterable.iterator()ので

Stream<String> stream = ... 
Iterable<String> falseIterable = stream::iterator; 

falseIterableが必要Iterableセマンティクスに従わない、stream.iterator()のラッパーであること、使用可能なIterator秒の時間を返しません。

関連する問題