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, sebuah Stream
adalah List
yang tail
adalah lazy 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 seperti map
dan filter
dan hanya mendapatkan yang baru Iterator
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 semua Stream
dalam memori, dengan memastikan Anda tidak menyimpan referensi ke its head
(misalnya, dengan menggunakan def
alih-alih val
mendefinisikan Stream
).
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.