2015-02-06 12 views

回答

0

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

任何方法都可以转换为等效函数类型。因此def recursiveListFiles(f: File): Array[File]等于File => Array[File],这很好,因为在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 _)

在更复杂的情况下,你可能需要使用这些更详细的一个工作选项,但在你的情况下,不需要打扰。

1

没有因为扩大flatMap样子:

flatMap(file => recursiveListFiles(file)) 

所以在these每个file是越来越映射到Array[File],其获取flatMap夷为平地。这里没有隐含的魔法(就像你问的那样)。

+1

其实,有; 'Array [File]'由隐式转换为'WrappedArray [File]',因为显然Java数组不会从'GenTraversableOnce'继承。 – 2015-02-07 04:07:42

+0

但不是OP的要求。 – 2015-02-07 04:20:03

+0

是的,只是一个澄清,如果有人误解。 – 2015-02-07 06:51:26

0

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

在你的情况下,这是recursiveListFiles这是一个File ⇒ Array[File]因此返回List[File]。产生的List[File]然后连接到these