scala函数-它是如何工作的?
我是scala/java新手,我试图理解下面的代码,它返回目录中的文件列表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
dir
的参数-是dir
aFile
还是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
)。您可以在中找到++
、过滤器
和平面地图
的定义,希望这些定义足以理解发生了什么dir
的类型是File
文件的数组
s,是这些
转换为scala列表
或缓冲区
,这是令人困惑的部分(例如,它可以导入scala.collection.JavaConversions.\u
-最好使用JavaConverters
,这使转换显式调用.asScala
或asJava
)。您可以在中找到++
、过滤器
和平面地图
的定义,希望这些定义足以理解发生了什么 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