这里的关键是确保将方法迭代器与Iterable一起使用。Scala2.8.0也做了很多工作来确保集合调用中的类型是一致的。
scala> val x = new Iterable[String] {
| def iterator = List("HAI", "YOU", "GUYS").iterator
| }
x: java.lang.Object with Iterable[String] = line18(HAI, YOU, GUYS)
我也会考虑使用流而不是迭代器。迭代器方法将在调用迭代器方法时构造整个文件集。一条小溪可能是懒洋洋的。
scala> def files(f : File) : Stream[File] = {
| if(f.isDirectory) {
| f.listFiles.toStream.map(files).flatten
| } else Stream(f)
| }
files: (f: java.io.File)Stream[java.io.File]
scala> files(new File("/home/jsuereth/projects/scala/scala"))
res1: Stream[java.io.File] = Stream(/home/jsuereth/projects/scala/scala/build/manmaker/classes/scala/man1/sbaz.class, ?)
scala> res1 take 10 foreach println
/home/jsuereth/projects/scala/scala/build/manmaker/classes/scala/man1/sbaz.class
/home/jsuereth/projects/scala/scala/build/manmaker/classes/scala/man1/scala$$anon$1.class
...
scala> def files_with_dirs(f : File) : Stream[File] = {
| if(f.isDirectory) Stream.cons(f, f.listFiles.toStream.map(files).flatten)
| else Stream(f)
| }
files_with_dirs: (f: java.io.File)Stream[java.io.File]