这个对flatMap的调用是否隐含了?

时间:2015-02-06 22:47:59

标签: scala flatmap

在此代码中:

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

取自:How do I list all files in a subdirectory in scala?

为什么flatMap(recursiveListFiles)会编译?由于recursiveListFiles接受File参数? file参数是否隐式传递给recursiveListFiles

3 个答案:

答案 0 :(得分:1)

不,因为展开的flatMap看起来像:

flatMap(file => recursiveListFiles(file))

因此,file中的每个these都会映射到Array[File]flatMap会在{{1}}中展平。这里没有隐含的魔法(就像你要问的那样)。

答案 1 :(得分:0)

flatMap使用函数f: (A) ⇒ GenTraversableOnce[B]返回List[B]

在您的情况下,recursiveListFilesFile ⇒ Array[File]因此返回List[File]。然后将生成的List[File]连接到these

答案 2 :(得分:0)

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

任何方法都可以转换为等效的函数类型。因此,def recursiveListFiles(f: File): Array[File]相当于File => Array[File],这很棒,因为在Array[File]上,您有flatMap[B](f: File => Array[B]): Array[B],并且您的方法的函数类型完全适合:类型参数{{1 }被选为B

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

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

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