Stream中的isEmpty方法是否评估整个Stream?

时间:2010-05-13 09:38:23

标签: scala stream lazy-evaluation

在Scala中,在isEmtpy类的实例上调用Stream方法是否会导致对流进行完全评估?我的代码是这样的:

import Stream.cons

private val odds: Stream[Int] = cons(3, odds.map(_ + 2))
private val primes: Stream[Int] = cons(2, odds filter isPrime)

private def isPrime(n: Int): Boolean = n match {
  case 1 => false
  case 2 => true
  case 3 => true
  case 5 => true
  case 7 => true
  case x if n % 3 == 0 => false
  case x if n % 5 == 0 => false
  case x if n % 7 == 0 => false
  case x if (x + 1) % 6 == 0 || (x - 1) % 6 == 0 => true
  case x => primeDivisors(x) isEmpty
}


import Math.{sqrt, ceil}
private def primeDivisors(n: Int) =
  primes takeWhile { _ <= ceil(sqrt(n))} filter {n % _ == 0 }

那么,对isEmpty行的case x => primeDivisors(x) isEmpty的调用是否会导致所有主要除数被评估或只是第一次?

2 个答案:

答案 0 :(得分:9)

仅当流实际为空时:)

否则,只会查看流是否有头尾(与Stream.cons匹配)并返回false。

答案 1 :(得分:2)

查看来源:

https://lampsvn.epfl.ch/trac/scala/browser/scala/trunk/src///library/scala/collection/immutable/Stream.scala#L550

会建议一旦你有一个Stream.Cons实例,它就不能为空,所以总是返回false。因此,Stream.cons工厂方法似乎可能是评估第一个元素的方法,您可以通过运行它来显示:

Stream.cons(print("Hello"), Stream(print(" World!")))
解释器中的

,看到这也打印出“你好”。