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

Abh*_*kar 3 scala stream lazy-evaluation

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

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 }
Run Code Online (Sandbox Code Playgroud)

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

Apo*_*isp 9

只有当流实际上是空的:)

否则,它将只查看流是否有头部和尾部(匹配Stream.cons)并返回false.