Birincisi, hepsi katı değil . Bu, işlevlerle ilgili belirli bir matematiksel anlama sahiptir, ancak temel olarak, önceden değil, talep üzerine hesaplandıkları anlamına gelir.
Stream
gerçekten de tembel bir liste. Aslında, Scala, bir Stream
bir ise List
kimin tail
bir olduğunu lazy val
. Hesaplandıktan sonra, bir değer hesaplanmış olarak kalır ve tekrar kullanılır. Veya, dediğin gibi, değerler önbelleğe alınır.
Bir Iterator
, yalnızca bir kez kullanılabilir, çünkü kendi içinde bir koleksiyon değil, bir koleksiyona geçiş göstergesidir . Ne Scala o özel kılan gibi dönüşümü uygulayabileceğiniz gerçektir map
ve filter
ve sadece yeni olsun Iterator
bir sonraki element için sorduğunuzda sadece bu dönüşümleri uygulanacağı.
Scala, sıfırlanabilen yineleyiciler sağlardı, ancak genel olarak desteklenmesi çok zordur ve 2.8.0 sürümünü yapmadılar.
Görünümlerin bir veritabanı görünümü gibi görüntülenmesi amaçlanmıştır. Bir "sanal" koleksiyon üretmek için bir koleksiyon için geçerli olan bir dönüşüm serisidir. Söylediğiniz gibi, tüm dönüşümleri her getirmeniz gerektiğinde tüm dönüşümler yeniden uygulanır.
Hem Iterator
görüntüler hem de görüntüler mükemmel bellek özelliklerine sahiptir. Stream
güzeldir, ancak Scala'da asıl yararı sonsuz diziler yazmaktır (özellikle özyinelemeli olarak tanımlanan diziler). Bir edebilir tüm tutarak önlemek Stream
emin onun bir başvuru tutmayız yaparak, olsa da, bellekte head
(örneğin, kullanarak def
yerine val
tanımlamak için Stream
).
Görüşlerin yol açtığı cezalar nedeniyle, genellikle force
dönüşümleri uyguladıktan sonra veya görüşün toplam boyutuna kıyasla yalnızca birkaç öğenin getirilmesi bekleniyorsa bir görünüm olarak saklanmalıdır.