Apa perbedaan antara Stream, Views (SeqView), dan Iterator dalam skala? Inilah pemahaman saya:
- Mereka semua adalah daftar malas.
- Aliran menyimpan nilai di cache.
- Iterator hanya dapat digunakan sekali? Anda tidak dapat kembali ke awal dan mengevaluasi nilainya lagi?
- Nilai tampilan tidak disimpan dalam cache tetapi Anda dapat mengevaluasinya lagi dan lagi?
Jadi jika saya ingin menghemat ruang heap, haruskah saya menggunakan iterator (jika saya tidak akan menelusuri daftar lagi) atau tampilan? Terima kasih.
Jawaban:
Pertama, mereka semua tidak ketat . Itu memiliki arti matematis tertentu yang terkait dengan fungsi, tetapi, pada dasarnya, berarti fungsi tersebut dihitung sesuai permintaan, bukan sebelumnya.
Stream
memang daftar malas. Bahkan, di Scala, sebuahStream
adalahList
yangtail
adalahlazy val
. Setelah dihitung, sebuah nilai tetap dihitung dan digunakan kembali. Atau, seperti yang Anda katakan, nilainya di-cache.An
Iterator
hanya dapat digunakan sekali karena ini adalah penunjuk traversal ke dalam koleksi, dan bukan koleksi itu sendiri. Apa yang membuatnya istimewa di Scala adalah kenyataan bahwa Anda dapat menerapkan transformasi sepertimap
danfilter
dan hanya mendapatkan yang baruIterator
yang hanya akan menerapkan transformasi ini ketika Anda meminta elemen berikutnya.Scala dulu menyediakan iterator yang dapat disetel ulang, tetapi sangat sulit untuk didukung secara umum, dan mereka tidak membuat versi 2.8.0.
Tampilan dimaksudkan untuk dilihat seperti tampilan database. Ini adalah rangkaian transformasi yang diterapkan pada suatu koleksi untuk menghasilkan koleksi "virtual". Seperti yang Anda katakan, semua transformasi diterapkan kembali setiap kali Anda perlu mengambil elemen darinya.
Baik
Iterator
tampilan maupun tampilan memiliki karakteristik memori yang sangat baik.Stream
bagus, tetapi, di Scala, manfaat utamanya adalah menulis urutan tak terbatas (terutama urutan yang didefinisikan secara rekursif). Seseorang dapat menghindari menyimpan semuaStream
dalam memori, dengan memastikan Anda tidak menyimpan referensi ke itshead
(misalnya, dengan menggunakandef
alih-alihval
mendefinisikanStream
).Karena penalti yang ditimbulkan oleh tampilan, seseorang harus
force
menggunakannya setelah menerapkan transformasi, atau menyimpannya sebagai tampilan jika hanya beberapa elemen yang diharapkan akan diambil, dibandingkan dengan ukuran total tampilan.sumber
Iterator
juga cukup berguna untuk menyelidiki yang tak terbatas, dan saya biasanya lebih memilihnya daripada aliran jika memungkinkan. Manfaat nyata dalam aliran adalah bahwa nilai yang diakses sebelumnya disimpan dalam cache, yang merupakan keuntungan serius saat mencoba menerapkan sesuatu seperti urutan fibonacci - yang didefinisikan dalam istilah nilai sebelumnya.