Pertanyaan Streaming vs Views vs Iterators


Apa perbedaan antara Streaming, Views (SeqView), dan Iterators dalam scala? Ini adalah pemahaman saya:

  • Mereka semua daftar malas.
  • Streaming menyimpan nilai-nilai.
  • Iterators hanya bisa digunakan satu kali? Anda tidak bisa kembali ke awal dan mengevaluasi nilainya lagi?
  • Nilai-nilai tampilan tidak di-cache tetapi Anda dapat mengevaluasinya lagi dan lagi?

Jadi jika saya ingin menghemat ruang heap, haruskah saya menggunakan iterator (jika saya tidak akan melintasi daftar lagi) atau dilihat? Terima kasih.


126
2018-03-01 18:56


asal


Jawaban:


Pertama, mereka semua tidak ketat. Itu memiliki arti matematika tertentu yang terkait dengan fungsi, tetapi, pada dasarnya, berarti mereka dihitung berdasarkan permintaan, bukan di muka.

Stream adalah daftar malas memang. Bahkan, di Scala, a Stream adalah List yang tail adalah lazy val. Setelah dihitung, nilai tetap dihitung dan digunakan kembali. Atau, seperti yang Anda katakan, nilainya di-cache.

Sebuah Iterator hanya dapat digunakan satu kali karena itu adalah a penunjuk traversal  menjadi koleksi, dan bukan koleksi tersendiri. Apa yang membuatnya istimewa di Scala adalah kenyataan bahwa Anda dapat menerapkan transformasi seperti map dan filter dan dapatkan yang baru Iterator yang hanya akan menerapkan transformasi ini ketika Anda meminta elemen berikutnya.

Scala digunakan untuk menyediakan iterator yang dapat direset, tetapi sangat sulit untuk mendukung secara umum, dan mereka tidak membuat versi 2.8.0.

Tampilan dimaksudkan untuk dilihat seperti tampilan database. Ini adalah serangkaian transformasi yang mana berlaku untuk koleksi untuk menghasilkan koleksi "virtual". Seperti yang Anda katakan, semua transformasi diterapkan kembali setiap kali Anda perlu mengambil elemen darinya.

Kedua Iterator dan pandangan memiliki karakteristik memori yang sangat baik. Stream itu bagus, tetapi, di Scala, manfaat utamanya adalah menulis sekuens tak terbatas (khususnya urutan yang didefinisikan secara rekursif). Satu bisa hindari menyimpan semua Stream dalam ingatan, meskipun, dengan memastikan Anda tidak menyimpan referensi ke nya head (misalnya, dengan menggunakan def dari pada val untuk menentukan Stream).

Karena hukuman yang ditimbulkan oleh pandangan, biasanya harus force setelah menerapkan transformasi, atau menjadikannya sebagai pandangan jika hanya beberapa elemen yang diharapkan dapat diambil, dibandingkan dengan ukuran total tampilan.


171
2018-03-01 19:31