Java 8.でストリームについて学習しています。この概念について混乱しました:
コレクションはメモリ内のデータ構造であり、データ構造が現在持っているすべての値を保持します。コレクションに追加する前に、コレクション内のすべての要素を計算する必要があります。対照的に、ストリームは、要素がオンデマンドで計算される概念的に固定されたデータ構造です。
わかりません。 コレクションに追加する前に計算された値のみをコレクションに保持するにはどうすればよいですか?また、ストリームと固定データ構造を比較するとどうなりますか?
あなたはあなたの引用のソースを提供しなかったので、あなたに javadoc を引用させてください:
ストリームは、いくつかの点でコレクションと異なります。
- ストレージなし。ストリームは、要素を格納するデータ構造ではありません。代わりに、データ構造、配列、ジェネレーター関数、I/Oチャネルなどのソースから、計算操作のパイプラインを通じて要素を伝達します。
- 機能的な性質。ストリームに対する操作は結果を生成しますが、ソースを変更しません。たとえば、コレクションから取得した
Stream
をフィルタリングすると、ソースコレクションから要素が削除されるのではなく、フィルタリングされた要素なしで新しいStream
が生成されます。- 怠惰を求める。フィルタリング、マッピング、重複除去などの多くのストリーム操作は遅延して実装でき、最適化の機会を提供します。たとえば、「3つの連続した母音で最初の
String
を見つける」では、すべての入力文字列を調べる必要はありません。ストリーム操作は、中間(Stream
生成)操作と最終(値生成または副作用生成)操作に分かれています。中間操作は常に遅延します。- おそらく無制限。コレクションのサイズは有限ですが、ストリームはそうである必要はありません。
limit(n)
またはfindFirst()
などの短絡演算を使用すると、無限ストリームの計算を有限時間で完了することができます。- 消耗品。ストリームの要素は、ストリームの存続期間中に一度だけ訪問されます。
Iterator
と同様に、ソースの同じ要素に再度アクセスするには、新しいストリームを生成する必要があります。
対照的に、 Collection
は、オブジェクト(要素)のコンテナです。オブジェクトがコレクションに以前に追加されていない限り、コレクションからオブジェクトを取得(取得)することはできません。