2017-07-30 92 views
0

任何人都可以教我使用mapflatMap的房屋用例嗎?斯卡拉 - 地圖和平面地圖之間的差異

Option的情況下,我知道這兩種方法都有各自的簽名,def map(A => B): Option[B]def flatMap(A => Option[B]): Option[B]

所以,我可以通過兩種方式獲得一些價值:

scala> val a = Some(1).map(_ + 2) 
a: Option[Int] = Some(3) 

scala> val a2 = Some(1).flatMap(n => Some(n + 2)) 
a2: Option[Int] = Some(3) 

當我寫一個方法:,有

def plusTwo(n: Int): Int = n + 2 
Some(1).map(plusTwo) 

def plusTwo(n: Int): Option[Int] = Some(n + 2) 
Some(1).flatMap(plusTwo) 

之間有什麼區別flatMap可以轉換爲理解,幾乎所有方法都更好價值Option包裝?

回答

0

您的功能plusTwo返回所有輸入的有效結果,因爲您可以將2添加到任何Int。

沒有必要定義它返回Option [Int],因爲None值永遠不會返回。這就是爲什麼你使用這些功能Option.map

但並不是所有的功能都對每個輸入有意義的結果。例如,如果你的函數按功能參數劃分了一些數字,那麼把零傳遞給該函數是沒有意義的。

比方說,我們有一個函數:

def divideTenBy(a: Int): Double 

當你與零調用它,然後則拋出ArithmeticException。然後你必須記住捕捉這個異常,所以最好讓我們的函數更少出錯。

def divideTenBy(a: Int): Option[Double] = if (a == 0) None else Some(10/a) 

有了這樣的功能,你可以使用flatMap,因爲你可以在可選(左操作數)「無」值或給定函數可以返回無。

scala> None.flatMap(divideTenBy) 
res9: Option[Double] = None 

scala> Some(2).flatMap(divideTenBy) 
res10: Option[Double] = Some(5.0) 

scala> Some(0).flatMap(divideTenBy) 
res11: Option[Double] = None 

現在你可以放心地在任何值映射此功能

0

比方說,你有一個清單:

val names = List("Benny", "Danna", "Tal") 
names: List[String] = List(Benny, Danna, Tal) 

現在讓我們去你的榜樣。假設我們有一個返回選項的功能:

def f(name: String) = if (name contains "nn") Some(name) else None 

地圖功能的工作原理是在應用列表中的一個功能,每一個元素:

names.map(name => f(name)) 
List[Option[String]] = List(Some(Benny), Some(Danna), None) 

在另一方面,flatMap應用於的返回功能列表中的每個元素的序列,並展平了結果到原來的列表

names.flatMap(name => f(name)) 
List[String] = List(Benny, Danna) 

正如你所看到的,flatMap刪除一些/無層和只保留原點列表。