<p>您是对的,您通常会将python <code>yield</code>替换为某种惰性求值。这里有一个概念证明,它使用case类来表示一个目录,以避免在本例中进行文件IO操作。在</p>
<pre class="lang-scala prettyprint-override"><code>case class Directory(val name: String, val files: List[String], val subDirectories: List[Directory])
def descendFilter(directory: Directory): Boolean = directory.name != "tmp"
def matchFilter(path: String): Boolean = path contains "important"
def traverse(directory: Directory, path: String = ""): Stream[String] = {
val newPath = path + directory.name + "/"
val files = (directory.files map (newPath + _)).toStream
val filteredSubdirs = directory.subDirectories filter descendFilter
val recursedSubdirs = filteredSubdirs map {x => traverse(x, newPath)}
val combinedSubdirs = recursedSubdirs.fold(Stream.Empty)(_ ++ _)
(path + directory.name) #:: files ++ combinedSubdirs
}
val directory = Directory("", List(), List(
Directory("var", List("pid"), List()),
Directory("opt", List("java"), List()),
Directory("tmp", List("lots", "of", "temp", "files"), List()),
Directory("home", List(), List(
Directory("karl", List("important stuff"), List())
))
))
traverse(directory) filter matchFilter foreach println
</code></pre>
<p>您基本上可以像处理整个文件系统一样处理流,但在内部,它只会根据需要获取它们,并以同样快的速度丢弃它们,除非您在其他地方保留对它们的引用。在</p>