0

在这段代码中:

import java.io.File
def recursiveListFiles(f: File): Array[File] = {
  val these = f.listFiles
  these ++ these.filter(_.isDirectory).flatMap(recursiveListFiles)
}

取自:如何列出 scala 子目录中的所有文件?

为什么要flatMap(recursiveListFiles)编译?asrecursiveListFiles接受File参数?文件参数是否隐式传递给recursiveListFiles

4

3 回答 3

1

不,因为展开后的flatMap样子:

flatMap(file => recursiveListFiles(file))

所以每个fileinthese都被映射到一个Array[File],它在flatMap. 这里没有隐含的魔法(按照您的要求)。

于 2015-02-06T22:54:24.103 回答
0

flatMap需要一个函数f: (A) ⇒ GenTraversableOnce[B]来返回List[B]

在您的情况下,它采用recursiveListFileswhich is aFile ⇒ Array[File]因此返回 a List[File]。然后将此结果List[File]连接到these.

于 2015-02-06T22:55:33.880 回答
0

有点。flatMap相当明确地将一个参数传递给它自己的参数。这是高阶函数的本质——你基本上给它一个回调,它调用回调,然后它对结果做一些事情。唯一隐含的事情是将方法转换为函数类型。

任何方法都可以转换为等效的函数类型。Sodef recursiveListFiles(f: File): Array[File]等价于File => Array[File],这很好,因为在 an 上Array[File],您有flatMap[B](f: File => Array[B]): Array[B],并且您的方法的函数类型非常适合:类型参数B被选择为File

如另一个答案中所述,您可以通过执行以下操作显式创建该函数:

these.filter(_.isDirectory).flatMap(file => recursiveListFiles(file))these.filter(_.isDirectory).flatMap(recursiveListFiles(_))these.filter(_.isDirectory).flatMap(recursiveListFiles _)

在更复杂的情况下,您可能需要使用这些更详细的选项之一,但在您的情况下,无需费心。

于 2015-02-07T15:04:50.007 回答