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.
Streammemang daftar malas. Bahkan, di Scala, sebuah Streamadalah Listyang tailadalah lazy val. Setelah dihitung, sebuah nilai tetap dihitung dan digunakan kembali. Atau, seperti yang Anda katakan, nilainya di-cache.
An Iteratorhanya 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 mapdan filterdan hanya mendapatkan yang baru Iteratoryang 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 Iteratortampilan maupun tampilan memiliki karakteristik memori yang sangat baik. Streambagus, tetapi, di Scala, manfaat utamanya adalah menulis urutan tak terbatas (terutama urutan yang didefinisikan secara rekursif). Seseorang dapat menghindari menyimpan semua Streamdalam memori, dengan memastikan Anda tidak menyimpan referensi ke its head(misalnya, dengan menggunakan defalih-alih valmendefinisikan Stream).
Karena penalti yang ditimbulkan oleh tampilan, seseorang harus forcemenggunakannya setelah menerapkan transformasi, atau menyimpannya sebagai tampilan jika hanya beberapa elemen yang diharapkan akan diambil, dibandingkan dengan ukuran total tampilan.