我是Scala的新手,所以我只是在试验.以下代码在D:\ Downloads下递归打印出所有文件的名称:
import java.io.File
object Run {
def main (args: Array[String]){
//read each file
val f = new File("""D:\Downloads""");
listFiles(f)
}
def listFiles(f: Any): Unit= f match{
case f:File if f.isDirectory => f.listFiles().deep.foreach(listFiles(_))
case f:File if f.isFile => println(f.getName)
case _ => Unit
}
}
Run Code Online (Sandbox Code Playgroud)
这有效.现在,我想listFiles建立一个字符串列表并返回它.这就是我所做的:
def listFiles(f: Any): List[String] = f match{
case f:File if f.isDirectory => f.listFiles().foreach(listFiles(_))
case f:File if f.isFile => List(f.getName)
case _ => Nil
}
Run Code Online (Sandbox Code Playgroud)
当f是目录时,foreach应递归调用listFiles并返回List.如何将所有这些数组连接在一起并返回它们?有没有更好的方法呢?
以下内容可能会有所改进,但它应该是一个可接受的起点:
def listFiles(f: File) = {
def run(f: File, acc: List[File]): List[File] =
if(f.isFile) f :: acc
else f.listFiles.foldLeft(acc) {(l, f) => run(f, l)}
run(f, Nil)
}
Run Code Online (Sandbox Code Playgroud)
根据您的方法,使用flatMap:
def listFiles(f: Any): List[String] = f match{
case f:File if f.isDirectory => f.listFiles().toList.flatMap(listFiles(_))
case f:File if f.isFile => List(f.getName)
case _ => Nil
}
Run Code Online (Sandbox Code Playgroud)