2016-05-12 23 views

回答

1

flatmap函數的作用是取一個返回一個列表的函數,然後將結果展平。

因此,它會映射迭代(在這種情況下分割),然後將生成的2D迭代(本例中爲List)展平。

+0

好的,我明白了,謝謝。 –

1

讓我們稍微擴展一下。首先,讓我們來定義你的xxx用的那種,我覺得你想要的例子:

val xxx = Array("hello there 馬慧超", "how are you", "nice to meet you") 

現在,讓我們寫出來你的邏輯不再手:

def words(str : String) : Array[String] = str.split(" ") 
xxx.flatMap(string => words(string)) 

我們先從一個字符串數組。在某個中間點,函數words在每個這些立即字符串上被調用,這產生Array[String],因此概念上我們有一串字符串數組。

但是,我們最終得到的只是一個字符串數組,「扁平化」,因爲字數組中間序列中的每個單詞都成爲一個長數組的一部分。因此,從概念上講,首先我們執行該映射函數(words,或者在這種情況下,更直接地split),然後我們展開。

所以,直接回答你的問題,分裂然後扁平化。


更新(更多,「因爲爲什麼不呢?)

它甚至不清楚這將意味着什麼‘平坦’串序列,但非正式你可能首先想到串聯。我們可以很容易證明這不是儀器發生的情況。如果您嘗試

def words(str : String) : Array[String] = {println(str); str.split(" ")} 
xxx.flatMap(string => words(string)) 

您將看到所有單個字符串,而不是一個串聯的字符串。

這對於flatMap方法的其他類型在邏輯上是必需的。對於

Some("there").flatMap(str => Some(str.toUpperCase)) 

沒有「扁平化」,你可以在選項Some(there)上flatMap被稱爲執行。一旦我們嵌套一次性上下文,即當考慮假設的中間值flatten將被調用以生成Some(THERE)時,「展平」僅被定義和有意義。

+0

謝謝我的朋友,我明白了,非常感謝你。 –

0

flatMap可以看作是操作'map'和'flatten'的組合。

至於你的問題,答案是'拆分',然後'平坦'。

下面的例子是用來說明這一點:

val nestedNumbers = List(List(1, 2), List(3, 4)) 

nestedNumbers.flatMap(x => x.map(_ * 2)) 

輸出是

res0: List[Int] = List(2, 4, 6, 8) 

,這等效於以下代碼:

nestedNumbers.map((x: List[Int]) => x.map(_ * 2)).flatten 

,它的輸出是也

res0: List[Int] = List(2, 4, 6, 8) 

的引用是有 https://twitter.github.io/scala_school/zh_cn/collections.html#flatMap

有好運氣

+0

好的,現在我知道了,謝謝你們,這是你非常熱情的心。 –

1

flatMap是地圖的組合,然後壓平。下面的例子可以解釋我們調用map然後變平的過程,並且結果是List [Char],而flatMap直接將Seq轉換爲List [Char]。

val avengers = Seq("Ironman", "Thor", "Captain America") 
val capsAvengers = avengers.map(_.toUpperCase) 
println(avengers) 
println(capsAvengers) 
println(capsAvengers.flatten) 
println(avengers.flatMap(.toUpperCase)) 

結果:

List(Ironman, Thor, Captain America) 

List(IRONMAN, THOR, CAPTAIN AMERICA) 

List(I,R,O,N,M,A,N,T,H,O,R,C,A,P,T,A,I,N, ,A,M,E,R,I,C,A) 

List(I,R,O,N,M,A,N,T,H,O,R,C,A,P,T,A,I,N, ,A,M,E,R,I,C,A) 
+0

謝謝我明白了,非常感謝 –

1

許多很好的答案,但都太長了:) 這很簡單:你分割之前,沒有什麼拉平。

+0

- - !,你一定是個聰明的孩子,謝謝。 –