2017-07-26 53 views
0

map和flatMap有什麼區別?正如我們可以做一個scala地圖和flatMap的區別

1 to 5 map(c => println(c)) 

但不

1 to 5 flatMap(c => println(c)) 

在另一方面,這個工程

def h(i: Int) = if (i >= 2) Some(i) else None 
1 to 5 flatMap(h) 

我明白flatMap是地圖和扁平的,但不知道什麼時候一個可以使用地圖,並且可以使用flatMap。

+1

[地圖與FlatMap上字符串](https://stackoverflow.com/questions/19209519/map-versus-flatmap結果-on-string)回答你的問題 – prayagupd

+0

這與https://stackoverflow.com/questions/42997900/apache-spark-comparison-of-map-vs-flatmap-vs-mappartitions-vs-mappartitionswith –

回答

3

我們來看看簽名flatMap

def flatMap[B](f: (Int) ⇒ GenTraversableOnce[B]): TraversableOnce[B] 

map

def map[B](f: (A) ⇒ B): IndexedSeq[B] 

你可以看到的f的結果類型必須爲GenTraversableOnce[B]flatMap簽名。 ,但f的結果類型map沒有限制。

結果類型println(x)Unit,結果類型x+2Int。由於兩者都不執行GenTraversableOnce[B],因此您不能執行flatMap(x=>println(x))flatMap(x=>x+2)

在另一方面Some(i)None具有Option[Int]類型,其可以被隱式轉換爲Iterable[Int]source

Iterable簽名是

trait Iterable[+A] extends Traversable[A] 

Traversable

trait Traversable[+A] .. with TraversableOnce[A]` 

最後是TraversableOnce

trait TraversableOnce[+A] extends GenTraversableOnce[A] 

因此Option[Int]實現GenTraversableOnce[Int]所以可以使用它作爲flatMap[Int]

1

錯誤是:

類型不匹配,預期:(​​INT)=> GenTraverableOnce [NotInferedB], 實際:(INT)=>單位

由於flatMap是組合mapflatten。因此flatMap將在序列的每個元素上運行映射,然後運行變平。

例如:[1,2][2,3] - >[1,2,2,3]

Scala中不能做到這一點與類型單位。技術上,因爲單位不執行GenTraverableOnceOption也不是,但Option[A]可以隱式轉換爲Iterable[A],即GenTraverableOnce[A]。這裏是reference

+0

類似,感謝幫幫我。爲什麼這不起作用flatMap(x => x + 2)其中map(x => x + 2)的作用是什麼?也許你已經提到過,但我沒有得到答案。 – Srinivas

+0

'flatMap(x => x + 2)'仍然不起作用,因爲此時的簽名是:'flatMap [Int,Int]'。但是Int不執行'GenTraversableOnce'。 'map'沒有這個限制。你可以從任意類型A映射到任意類型B. – hqt

+0

你可以'flatMap(x => Some(x))'因爲此時'flatMap'簽名是'flatMap [Int,Option]'。但'Option [A]'可以隱式轉換爲'GenTraverableOnce [A]'。你可以看到這個鏈接:https://stackoverflow.com/questions/11429360/is-option-gentraversableonce – hqt

相關問題