2017-07-30 83 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删除一些/无层和只保留原点列表。