2016-09-11 15 views
0

今日、私はJava 8のStreamsについて語っています。このコンセプトについて読んだときに混乱しましたJava 8のStreamsとCollectionsの違い

コレクションは、データ構造が現在持っているすべての値を保持するインメモリデータ構造です。コレクション内のすべての要素を計算する必要がありますコレクションに追加されました。対照的に、ストリームは概念的に固定されたデータ構造であり、そこでは要素が必要に応じて計算される。

わかりません。 コレクションには、コレクションに追加する前に計算されていなければならない値のみを保持することはできますか?また、ストリームと固定データ構造の比較が意味することは何ですか?

誰かがこれを私に説明できますか?

+1

あなたが何を求めているのか不明です。それが追加される前に計算されたことについてあなたが理解していないものは何ですか?または「概念的に固定されたデータ構造」?あなたの質問ごとに、あるいはあなたのタイトルごとに、colelctionsとストリームの違いについて、これらの用語の意味について尋ねているかどうかは不明です。これはさらに簡単です。 – EJP

答えて

14

あなたの引用のソースを提供するので、私はあなたにjavadocを引用させませんでした:

ストリームは、いくつかの方法でのコレクションとは異なります。

  • ないストレージ。ストリームは、要素を格納するデータ構造ではありません。代わりに、データ構造、配列、ジェネレータ関数、またはI/Oチャネルなどのソースから計算操作のパイプラインを通じて要素を伝達します。
  • 機能性。ストリーム上の操作は結果を生成しますが、ソースを変更しません。たとえば、コレクションから取得したStreamをフィルタリングすると、ソースコレクションから要素を削除するのではなく、フィルタリングされた要素がない新しいStreamが生成されます。
  • 怠惰を求める。フィルタリング、マッピング、削除の重複など、多くのストリーム操作を遅延実装することができ、最適化の機会が得られます。たとえば、「3つの連続する母音を持つ最初のStringを見つける」は、すべての入力文字列を調べる必要はありません。ストリーム操作は、中間操作(Stream -producing)操作と端末(値または副作用生成)操作に分かれています。中間的な操作は常に怠惰です。
  • おそらく無制限です。コレクションには有限のサイズがありますが、ストリームには必要ありません。 limit(n)またはfindFirst()のような短絡動作は、無限ストリームの計算を有限時間で完了できるようにします。
  • 消耗品。ストリームの要素は、ストリームの存続中に一度し​​かアクセスされません。 Iteratorのように、ソースの同じ要素を再訪するには、新しいストリームを生成する必要があります。対照的に

Collectionオブジェクト(要素)の容器あります。オブジェクトが以前コレクションに追加されていない限り、コレクションからオブジェクトを取得(取得)することはできません。

+0

'以前にオブジェクトがコレクションに追加されていない限り、コレクションからオブジェクトを取得(取得)できません。 'これは当てはまりません。そのような契約はありません。コレクションは、そのライフを空ではなく始めることができます。それは怠け者であり、あなたがそれを求めるときだけ要素を実現することもできます(例えば、Hibernateの怠惰なコレクション)。反復子は無制限の数の要素を返すことができるので、有限のサイズでさえ疑問のある性質です。 –

+1

@MarkoTopolnik 'Iterator'は' Collection'ではありませんので、2つを混同しないでください。コレクションには 'size()'があります。 ---私は、建設中の要素のリストを、その時に追加することと同じにすることを検討します。要素は、コレクションのメンバーになる前に存在します。これがポイントです。 ---しかし、あなたが正しいです、それは実際のストレージバッキングを持たずに 'Collection'インターフェースを実装することが可能です.Hibernateはその一例です。しかし、そこにさえ、実際には*実際の店(データベース)から技術的に怠惰な読み込みです。要素はすでに存在します。 – Andreas

+0

Collectionの契約ではイテレータが必要なので、何も混乱させていません。コレクションには 'size()'があります。これは、「疑わしい」と言った理由です。例えば、 'Map'にもサイズがありますが、' HashMap'に2^31以上の要素を持つことができます。 「実際に存在する」要素の特徴付けは哲学的です。また、実現時に、例えばダイスを投げて計算することもできる。 –

関連する問題