2015-02-06 41 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