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

标签 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导致评估所有质数除数还是仅评估第一个?

最佳答案

仅当流实际上为空时 :)

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

关于scala - Stream 中的 isEmpty 方法是否评估整个 Stream?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2825731/

相关文章:

java - 未分配的可关闭流

Haskell 元组单子(monad)太严格了?

android - Kotlin:lateinit 到 val,或者,可以设置一次的 var

scala - 对片段真的很困惑

scala - Play Framework 2.0。升级骨骼cp

java - http 获取正文请求

java - 包私有(private)方法覆盖时发生AbstractMethodError

java - 通过 Socket 发送的图像流 - 服务器死锁问题

swift utf16 数据流 - 分成 block 的问题

c# - Lazy<T> 如何解决需要 new() 约束的问题?