从Scala中的匹配结果递归构建列表

Art*_*hur 1 scala

我是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.如何将所有这些数组连接在一起并返回它们?有没有更好的方法呢?

Nic*_*udo 5

以下内容可能会有所改进,但它应该是一个可接受的起点:

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)


joe*_*cii 5

根据您的方法,使用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)