Scalaでは、多くの(すべて?)タイプのコレクションに対してビューを作成できます。
ビューとは正確には何であり、ビューはどのような目的に役立ちますか?
Scalaでは、多くの(すべて?)タイプのコレクションに対してビューを作成できます。
ビューとは正確には何であり、ビューはどのような目的に役立ちますか?
ビューは、コレクションの非厳密バージョンです。これは、要素がアクセス時に計算され、通常のコレクションのように熱心に計算されないことを意味します。
例として、次のコードを取り上げます。
val xs = List.tabulate(5)(_ + 1)
val ys = xs.view map { x => println(x); x * x }
これだけでは何も出力されませんが、リストにアクセスするたびに計算が実行され、値が出力されます。つまり、を呼び出すたびys.head
に1
出力されます。コレクションの厳密なバージョンを再度取得したい場合は、それを呼び出すことができますforce
。この場合、すべての数字が印刷されます。
ビューの用途の1つは、計算にコストがかかる値のコレクションをトラバースする必要があり、一度に1つの値しか必要としない場合です。toStream
また、ビューを使用すると、評価された要素もキャッシュするビューを呼び出すことで、遅延シーケンスを構築できます。
1つのユースケースは、要素変換の最初の結果を収集する必要がある場合です。
case class Transform(n: Int) { println("Transform "+n)}
val list = List(1,2,3,4,5)
list.view.map(v => Transform(v)).collectFirst{case Transform(3) => println("found")}
プリント:
Transform 1
Transform 2
Transform 3
found
その間:
list.map(v => Transform(v)).collectFirst{case Transform(3) => println("found")}
プリント:
Transform 1
Transform 2
Transform 3
Transform 4
Transform 5
found
Scala2.8コレクションAPIからのビューを参照してください。
Stream
Scalaコレクションは、すべてのトランスフォーマーメソッドを遅延的に実装するを除いて、デフォルトですべてのトランスフォーマーで厳密です。ただし、コレクションビューに基づいて、すべてのコレクションを怠惰なコレクションに、またはその逆に変換する体系的な方法があります。ビューは、いくつかの基本コレクションを表す特別な種類のコレクションですが、すべてのトランスフォーマーを遅延実装します。..。
ビューの使用を検討する理由は2つあります。1つ目はパフォーマンスです。コレクションをビューに切り替えることで、中間結果の作成を回避できることを確認しました。これらの節約は非常に重要です。
..。
2番目のユースケースは、可変シーケンスのビューに適用されます。このようなビューの多くのトランスフォーマー関数は、元のシーケンスへのウィンドウを提供し、そのシーケンスの一部の要素を選択的に更新するために使用できます。
ビューは遅延計算に使用されますが、メモリの節約には使用されません。
コレクションに対してビューを作成する場合、メモリはすでにコレクションに割り当てられています。
を使用してビューを作成する場合val view = Range(1,9).view.
、コレクションにはすでにメモリが割り当てられています。メモリが大きすぎる場合、たとえば、Range(1,1000000000)
OOMは避けられません