ScalaのStreams、Views(SeqView)、Iteratorの違いは何ですか?これは私の理解です:
ヒープスペースを節約したい場合、イテレータ(リストを再度たどらない場合)またはビューを使用する必要がありますか?ありがとう。
まず、それらはすべて非厳密です。これは、機能に関連する特定の数学的意味を持ちますが、基本的に、事前にではなくオンデマンドで計算されることを意味します。
Stream
は確かに遅延リストです。実際、Scalaでは、Stream
はList
であり、そのtail
はlazy val
。計算されると、値は計算されたままになり、再利用されます。または、あなたが言うように、値はキャッシュされます。
Iterator
は、コレクションへのトラバーサルポインターであり、それ自体のコレクションではないため、一度しか使用できません。 Scalaで特別なのは、map
やfilter
などの変換を適用し、次の要素を要求したときにのみこれらの変換を適用する新しいIterator
を取得できるという事実です。
Scalaはリセット可能なイテレータを提供していましたが、一般的な方法でサポートするのは非常に難しく、バージョン2.8.0を作成しませんでした。
ビューは、データベースビューのように表示することを目的としています。これは、コレクションに適用して「仮想」コレクションを生成する一連の変換です。あなたが言ったように、すべての変換は、そこから要素を取得する必要があるたびに再適用されます。
Iterator
とビューの両方に優れたメモリ特性があります。 Stream
はいいですが、Scalaでの主な利点は、無限シーケンス(特に再帰的に定義されたシーケンス)を書くことです。 1つcanただし、Stream
への参照を保持しないようにして(たとえば、head
の代わりにdef
を使用してval
を定義することにより)、Stream
のすべてをメモリに保持しないようにします。
ビューにはペナルティがあるため、通常、変換を適用した後はforce
、またはビューの合計サイズと比較して、フェッチされる要素が少ないと予想される場合はビューとして保持する必要があります。