2009-10-06 9 views

答えて

42

ストリームmemoisesとイテレータはありません。同じStreamを何度もトラバースし、毎回同じ結果を得ることができます。一方、反復子は、一度しか移動できません。

+1

私はN番目の要素にアクセスすると、アクセス時間はO(1)かO(N)ですか? – ryeguy

+7

@ryeguy Streamは要素値をキャッシュするためのリンクリストを作成するので、O(n)です。 –

+1

OK、StreamとIterableの違いは何ですか? –

18

これらは、現在の要素にアクセスするための構成要素であり、残りの要素の一覧(未知の尾)はまだありません。

Iteratorは、一度しかトラバースできない必須の構成です。

Streamは機能的構築物である。理論的には、それを複数回トラバースすることができます(また、他のものと同様に、すでに計算された部分を再計算することはありません)。実際には、ストリームは無限大または非常に大きい(つまり、それを最初に使用する理由)フルストリームへの参照はあまり意味がありません(あなたはOut of Memoryをかなり簡単に実行します)。

のように、その頭の中で怠惰ではないという事実に起因するいくつかの予期しない動作がある場合もあります平文は避けてください。Stream s。代わりに弱参照を使用して、またはIterateeshereも参照)またはsomething similiarを使用して、未参照の部分を自動的に忘れるScalazのEphemeralStreamを使用しています。

+0

私は不思議です:なぜEphemeralStreamはデフォルトの実装ではありませんか?忘れた部分は、データ系統(関数型言語)からいつでも再構築できます。これは大きなデザイン上の欠陥のようです。 – tribbloid

関連する問題