İlk bekliyordum budur "* 4" döndürür şudur: ikinci satırında lazy
yapmıyor şey-onu kaldırmak ve alabilirsiniz aynı sonuç.
Daha da önemlisi: takeWhile
aslında tembel, ki bu sadece başka Stream
döndürür ve ihtiyaç olana kadar o akışın kafasına geçmiş hiçbir şey değerlendirilecektir olduğunu. Aşağıdaki düşünün:
val s = Stream.from(1).takeWhile(_ > 0)
Sen ve ben s
sonsuz akışı olacak biliyorum, ama biz repl çalıştırıp bu yazarsanız, onu değerlendirmek gayet mutlu açıklanmıştır:
scala> val s = Stream.from(1).takeWhile(_ > 0)
s: scala.collection.immutable.Stream[Int] = Stream(1, ?)
Örneğinizde de aynı şey oluyor: takeWhile
'a ilettiğiniz (Int) ⇒ Boolean
, foreach
gibi bir şey gerekli olana kadar akış başının ötesindeki herhangi bir öğeyle beslenmeyecektir.
Sen takeWhile
yüklem içinde bir println
gibi bir şey ekleyerek bu daha da dramatik görebilirsiniz: Açıkça
scala> val s = Stream.from(1).takeWhile { x => println("Checking: " + x); x < 4 }
Checking: 1
s: scala.collection.immutable.Stream[Int] = Stream(1, ?)
scala> val l = s.toList
Checking: 2
Checking: 3
Checking: 4
l: List[Int] = List(1, 2, 3)
biz değerlendirilmesi zorla kadar sadece akışın kafa için çağrılan yüklem toList
numaralı telefonu arayarak akışın geri kalanı.