2017-10-04 8 views
10

ストリームを遅延生成するにはどうすればよいですか?コレクションベースのコードの移行中に、私はこのパターンに複数回実行している:私たちが知っているように遅延ストリームを作成する

Collection collection = veryExpensiveCollectionCreation(); 
return Stream.concat(firstStream, collection.stream()); 

た連結ストリームは一般的に、いい加減に処理されます。したがって、ストリーム処理が連結ストリームの最初の部分で停止した場合、高価なコレクションはまったく必要ありません。

パフォーマンス上の理由から、連結ストリームが実際に連結の第2部分の要素を反復しようとするまで、コレクション全体の作成を延期したいと思います。

擬似コードは

return Stream.concat(firstStream, new LazyStreamProvider() { 
    Stream<Something> createStream() { 
     return veryExpensiveCollectionCreation().stream(); 
    } 
); 

ようになります編集:私はストリームにコレクションの作成をリファクタリング承知しているが、APIの流れの全てを認識させるために、最善でしょう。ただし、この場合は変更不可能なAPIを持つ別のコンポーネントの一部です。たぶん

+1

あなたは 'veryExpensiveCollectionCreation()'の体を変更したり、単に返すために、それをオーバーロードすることができます'ストリーム'? – Mena

+2

'veryExpensiveCollectionCreation()'は厳密なコレクションではなくレイジーストリームを返すように変更できますか? – puhlen

答えて

13

ない最善の解決策が、それはいい加減に構築されますので、あなたはflatMap方法であなたのコレクションを構築することができます

return Stream.concat(
     firstStream, 
     Stream.of(Boolean.TRUE).flatMap(ignoredBoolean -> veryExpensiveCollectionCreation().stream()) 
); 
+2

テーブルの上に頭を向けて、これはとても分かりやすいので、私はそれを読んだ。 – Bananeweizen

関連する問題