这只是补充了m-w
一些日志记录以帮助理解它的好答案。
$ cd /david/test
$ find .
.
./file1
./file2
./file3d
./file3d/file1
./file3d/file2
./file4
爪哇:
import play.api.libs.iteratee._
import java.io.File
import scala.concurrent.Await
import scala.concurrent.duration.Duration
object ExampleEnumerator3 {
import scala.concurrent.ExecutionContext.Implicits.global
def exampleFn(file: File) { println(s"processing $file") }
def list(dir: File): Enumerator[File] = {
println(s"list $dir")
val initialInput: List[File] = List(dir)
Enumerator.unfold(initialInput) { (input: List[File]) =>
val next: Option[(List[File], File)] = input.headOption.map { file =>
if(file.isDirectory) {
(file.listFiles.toList.sortBy(_.getName) ++ input.tail) -> file
} else {
input.tail -> file
}
}
next match {
case Some(dn) => print(s"value to unfold: $input\n next value to unfold: ${dn._1}\n next input: ${dn._2}\n")
case None => print(s"value to unfold: $input\n finished unfold\n")
}
next
}
}
def main(args: Array[String]) {
val dir = new File("/david/test")
val res = list(dir).run(Iteratee.foreach(exampleFn))
Await.result(res, Duration.Inf)
}
}
日志:
list /david/test
value to unfold: List(/david/test)
next value to unfold: List(/david/test/file1, /david/test/file2, /david/test/file3d, /david/test/file4)
next input: /david/test
processing /david/test
value to unfold: List(/david/test/file1, /david/test/file2, /david/test/file3d, /david/test/file4)
next value to unfold: List(/david/test/file2, /david/test/file3d, /david/test/file4)
next input: /david/test/file1
processing /david/test/file1
value to unfold: List(/david/test/file2, /david/test/file3d, /david/test/file4)
next value to unfold: List(/david/test/file3d, /david/test/file4)
next input: /david/test/file2
processing /david/test/file2
value to unfold: List(/david/test/file3d, /david/test/file4)
next value to unfold: List(/david/test/file3d/file1, /david/test/file3d/file2, /david/test/file4)
next input: /david/test/file3d
processing /david/test/file3d
value to unfold: List(/david/test/file3d/file1, /david/test/file3d/file2, /david/test/file4)
next value to unfold: List(/david/test/file3d/file2, /david/test/file4)
next input: /david/test/file3d/file1
processing /david/test/file3d/file1
value to unfold: List(/david/test/file3d/file2, /david/test/file4)
next value to unfold: List(/david/test/file4)
next input: /david/test/file3d/file2
processing /david/test/file3d/file2
value to unfold: List(/david/test/file4)
next value to unfold: List()
next input: /david/test/file4
processing /david/test/file4
value to unfold: List()
finished unfold