ストリームを遅延生成するにはどうすればよいですか?コレクションベースのコードの移行中に、私はこのパターンに複数回実行している:私たちが知っているように遅延ストリームを作成する
Collection collection = veryExpensiveCollectionCreation();
return Stream.concat(firstStream, collection.stream());
た連結ストリームは一般的に、いい加減に処理されます。したがって、ストリーム処理が連結ストリームの最初の部分で停止した場合、高価なコレクションはまったく必要ありません。
パフォーマンス上の理由から、連結ストリームが実際に連結の第2部分の要素を反復しようとするまで、コレクション全体の作成を延期したいと思います。
擬似コードは
return Stream.concat(firstStream, new LazyStreamProvider() {
Stream<Something> createStream() {
return veryExpensiveCollectionCreation().stream();
}
);
ようになります編集:私はストリームにコレクションの作成をリファクタリング承知しているが、APIの流れの全てを認識させるために、最善でしょう。ただし、この場合は変更不可能なAPIを持つ別のコンポーネントの一部です。たぶん
あなたは 'veryExpensiveCollectionCreation()'の体を変更したり、単に返すために、それをオーバーロードすることができます'ストリーム'? – Mena
'veryExpensiveCollectionCreation()'は厳密なコレクションではなくレイジーストリームを返すように変更できますか? – puhlen