scala函数-它是如何工作的?

scala函数-它是如何工作的?,scala,Scala,我是scala/java新手,我试图理解下面的代码,它返回目录中的文件列表 它接受一个名为dir的参数-是diraFile还是File对象的类型 它返回类型为file的数组 它调用dir上的方法listFiles 最后一行是做什么的 def getRecursiveListOfFiles(dir: File): Array[File] = { val these = dir.listFiles these ++ these.filter(_.isDirectory).flatMap(get

我是scala/java新手,我试图理解下面的代码,它返回目录中的文件列表

  • 它接受一个名为
    dir
    的参数-是
    dir
    a
    File
    还是
    File
    对象的类型

  • 它返回类型为
    file
    的数组

  • 它调用
    dir
    上的方法
    listFiles

  • 最后一行是做什么的<代码>
    
    def getRecursiveListOfFiles(dir: File): Array[File] = {
     val these = dir.listFiles
     these ++ these.filter(_.isDirectory).flatMap(getRecursiveListOfFiles)
    }
    def getRecursiveListOfFiles(目录:文件):数组[文件]={
    val this=dir.listFiles
    this++this.filter(u.isDirectory).flatMap(getRecursiveListOfFiles)
    }

  • 你画的区别是什么?
    dir
    的类型是
    File

  • 文件的数组
    s,是

  • 它可能隐式地将
    这些
    转换为scala
    列表
    缓冲区
    ,这是令人困惑的部分(例如,它可以导入
    scala.collection.JavaConversions.\u
    -最好使用
    JavaConverters
    ,这使转换显式调用
    .asScala
    asJava
    )。您可以在中找到
    ++
    过滤器
    平面地图
    的定义,希望这些定义足以理解发生了什么

  • (注意:由于降价,我的4.以3.的形式出现:()

  • 你所画的区别是什么?
    dir
    的类型是
    File

  • 文件的数组
    s,是

  • 它可能隐式地将
    这些
    转换为scala
    列表
    缓冲区
    ,这是令人困惑的部分(例如,它可以导入
    scala.collection.JavaConversions.\u
    -最好使用
    JavaConverters
    ,这使转换显式调用
    .asScala
    asJava
    )。您可以在中找到
    ++
    过滤器
    平面地图
    的定义,希望这些定义足以理解发生了什么

  • (注意:由于降价,我的4.以3.的形式出现:()

    简而言之:

     these ++ these.filter(_.isDirectory).flatMap(getRecursiveListOfFiles)
    
    基本上是:

     val allSubDirectories:Array[Files] = these.filter(_.isDirectory)
     allSubDirectories.flatMap(getRecursiveListOfFiles)
     //i.e. for each sub-directory, again find all files in sub-directory
     these ++ (files of all sub-directories)
     //ultimately add files of sub-directory to the actual list
    
    另一种理解方法是:

    def getAllFiles(dir: File): List[File] = {
     val these = dir.listFiles.toList
     these ::: these.filter(_.isDirectory).map(x => getAllFiles(x)).flatten
    }
    
    基本相同的控制流程,即对于每个子目录,您获得所有文件的列表,然后在同一列表中添加子目录的文件。

    简而言之:

     these ++ these.filter(_.isDirectory).flatMap(getRecursiveListOfFiles)
    
    基本上是:

     val allSubDirectories:Array[Files] = these.filter(_.isDirectory)
     allSubDirectories.flatMap(getRecursiveListOfFiles)
     //i.e. for each sub-directory, again find all files in sub-directory
     these ++ (files of all sub-directories)
     //ultimately add files of sub-directory to the actual list
    
    另一种理解方法是:

    def getAllFiles(dir: File): List[File] = {
     val these = dir.listFiles.toList
     these ::: these.filter(_.isDirectory).map(x => getAllFiles(x)).flatten
    }
    

    基本上相同的控制流程,即对于每个子目录,您获得所有文件的列表,然后在同一列表中添加子目录的文件。

    我将尝试引导您了解我如何将其视为试图读取未知代码的人

    上下文应该非常清楚,
    File
    可以是常规文件或目录。它不包含文件内容,但表示文件系统中的任何条目,您可以使用其他库命令打开该文件。出于此功能的目的,
    File
    恰好包含更多的
    >文件
    s,如果它是一个目录,可以通过方法
    listFiles:List[Files]
    访问这些文件。它可能还提供其他信息,以便
    getRecursiveListOfFiles
    的原始调用者可以对结果列表进行处理

    同样根据上下文,
    这些
    显然是当前目录中的条目

    最后一行是最微妙的。但要分解它,它将
    这些
    增加为
    文件
    s,该文件位于
    这些
    目录中的条目中

    为了解释这一步骤,可以将
    List[File]
    flatMap
    的签名视为
    flatMap[B](f:File=>List[B]):List[B]
    ,其中
    B
    是一个类型变量。在这种情况下,因为相同的函数
    getRecursiveListOfFiles
    ,属于
    File=>List[File]类型
    ,是递归传递的,
    B
    只是
    文件
    ,因此我们可以将此特定调用视为
    flatMap(f:File=>List[File]):List[File]


    粗略地说,
    flatMap
    将函数
    f
    应用于容器中的每个项目,其中要求
    f
    返回相同类型的容器。“flat”部分原因很简单,这些单独的容器被组合在一起,而不是嵌套在一起,这就是
    map
    将要做的。这就是允许函数递归地添加在其子目录中找到的所有文件的原因。非常流畅。

    我将尝试引导您了解我如何将其视为试图阅读一篇文章的人未知代码的类型

    上下文应该非常清楚,
    File
    可以是常规文件或目录。它不包含文件内容,但表示文件系统中的任何条目,您可以使用其他库命令打开该文件。出于此功能的目的,
    File
    恰好包含更多的
    >文件
    s,如果它是一个目录,可以通过方法
    listFiles:List[Files]
    访问这些文件。它可能还提供其他信息,以便
    getRecursiveListOfFiles
    的原始调用者可以对结果列表进行处理

    同样根据上下文,
    这些
    显然是当前目录中的条目

    最后一行是最微妙的。但要分解它,它将
    这些
    增加为
    文件
    s,该文件位于
    这些
    目录中的条目中

    为了解释这一步骤,可以将
    List[File]
    flatMap
    的签名视为
    flatMap[B](f:File=>List[B]):List[B]
    ,其中
    B
    是一个类型变量。在这种情况下,因为相同的函数
    getRecursiveListOfFiles