2016-05-29 3 views
1

私はJava 8ストリームコーディングを初めて使用しています。 ここにコードがあります。私は走ろうとしています。あなたが業者を使用する場合はストリームはすでに稼働中または閉鎖中です。サプライヤがサポートしていません

Supplier filteredSupplier =() -> Stream.of(filteredStream.toArray(Obj[]::new)); 
Stream.concat((Stream<Obj>)filteredSupplier.get(), Stream.of(objs)).forEach(some operation); 

は、私の知る限りでは、あなたはサプライヤーでget()FUNCを使用してストリームにあなたが望む任意の時間を使用することができます。それでも、私は、 "ストリームはすでに操作されているか、またはを閉じています"となっています。

私の理解を助けてください、サプライヤーを経由してくるストリームを使用することについての制限はありますか?

答えて

5
この行に

Supplier filteredSupplier =() -> Stream.of(filteredStream.toArray(Obj[]::new)); 

二つの流れがある:filteredStreamStream.of(...)によって返さ一つ。

getメソッドを呼び出してSupplierを呼び出すと、Stream.of(...)が呼び出され、新しいストリームが作成されます。ただし、それぞれのコールは同じfilteredStreamを使用します。最初の呼び出しでfilteredStreamストリームが「使い切った」ため、Supplierは2度目の呼び出しでは機能しません。

が例外を回避するには、以下のようなもので、上記の行を交換してください:

Obj[] array = filteredStream.toArray(Obj[]::new); 
    Supplier<Stream<Obj>> filteredSupplier =() -> Stream.of(array); 

これは関係なく、あなたがSuppliergetメソッド呼び出し回数を、一度だけfilteredStreamを使用しません。

+0

ありがとうございます。私は複数回(filteredStream)を使用しなければならないストリームを持っているユースケースを持っています..それで、私はまずそれを配列に変換してサプライヤを取得し、サプライヤを使って何度もストリームを取得します。ストリームのソースリストやコレクションはありません。どうすればこのように動作しますか? – Try1

+0

誰でも入力できますか? – Try1

+0

@ Ka123:この場合、 'filteredStream'から一度配列を作成し、配列から何度でもストリームを作成したいとします。これを行うには、配列の作成をサプライヤから取り出します。私の更新された答えを見てください。 –

関連する問題