Scala 为什么我们要使用扁平化?它与平面地图有什么不同?

Scala 为什么我们要使用扁平化?它与平面地图有什么不同?,scala,flatmap,Scala,Flatmap,在scala中,为什么要使用展平?它与平面地图有什么不同? 涉及期货的示例将非常有用。flatten不涉及flatMap的“地图”部分。可以将其看作是将嵌套结构展平。选项[Option[Int]变成一个选项[Int],或者列表[List[Int]变成一个列表[Int](通过连接各个列表的元素) 相反,映射会更改结构中包含的元素。所以 Some(4).map(_ + 1) // evaluates to Some(5) 有时传递给map的函数返回底层结构本身的实例。假设您有一个可选id,并且如果

在scala中,为什么要使用
展平
?它与平面地图有什么不同?
涉及期货的示例将非常有用。

flatten
不涉及
flatMap
的“地图”部分。可以将其看作是将嵌套结构展平。
选项[Option[Int]
变成一个
选项[Int]
,或者
列表[List[Int]
变成一个
列表[Int]
(通过连接各个列表的元素)

相反,映射会更改结构中包含的元素。所以

Some(4).map(_ + 1) // evaluates to Some(5)
有时传递给
map
的函数返回底层结构本身的实例。假设您有一个可选id,并且如果设置了该id,您希望在数据库中查找该id,而不知道是否存在记录,因此您的函数还返回一个
选项

val optionalId: Option[String] = ???
def getRecord(id: String): Option[Record] = ???

val naiveResult: Option[Option[Record]] = optionalId.map(getRecord)
这通常不是你想要的。实际上,您有一个
选项[Record]
,不需要额外的嵌套。因此,您可以在
映射
之后立即调用
展平

optionalId.map(getRecord).flatten // evaluates to an Option[Record]
现在,
flatMap
基本上是两种方法的结合:

optionalId.flatMap(getRecord) // also yields an Option[Record]
flatMap
的应用不仅限于集合,而且更加通用。另一个有用的例子是期货。假设我们没有可选的id,但有一个表示最终将产生id的计算的Future[String]。我们还有一个方法,为id提供一个
Future[Record]
。我们现在可以从
Future[String]
中获得
Future[Record]
,如下所示:

val idFuture: Future[String] = ???
def getRecord(id: String): Future[Record] = ???

val recordFuture: Future[Record] = idFuture.flatMap(getRecord)

flatte
不涉及
flatMap
的“映射”部分。可以将其看作是将嵌套结构展平。
选项[Option[Int]
变成一个
选项[Int]
,或者
列表[List[Int]
变成一个
列表[Int]
(通过连接各个列表的元素)

相反,映射会更改结构中包含的元素。所以

Some(4).map(_ + 1) // evaluates to Some(5)
有时传递给
map
的函数返回底层结构本身的实例。假设您有一个可选id,并且如果设置了该id,您希望在数据库中查找该id,而不知道是否存在记录,因此您的函数还返回一个
选项

val optionalId: Option[String] = ???
def getRecord(id: String): Option[Record] = ???

val naiveResult: Option[Option[Record]] = optionalId.map(getRecord)
这通常不是你想要的。实际上,您有一个
选项[Record]
,不需要额外的嵌套。因此,您可以在
映射
之后立即调用
展平

optionalId.map(getRecord).flatten // evaluates to an Option[Record]
现在,
flatMap
基本上是两种方法的结合:

optionalId.flatMap(getRecord) // also yields an Option[Record]
flatMap
的应用不仅限于集合,而且更加通用。另一个有用的例子是期货。假设我们没有可选的id,但有一个表示最终将产生id的计算的Future[String]。我们还有一个方法,为id提供一个
Future[Record]
。我们现在可以从
Future[String]
中获得
Future[Record]
,如下所示:

val idFuture: Future[String] = ???
def getRecord(id: String): Future[Record] = ???

val recordFuture: Future[Record] = idFuture.flatMap(getRecord)

可能重复或可能重复另一个可能重复为什么是“可能重复”?这些问题是相关的,但我不认为它们是重复的。可能复制或可能复制的另一个可能的复制品“为什么可能复制”?这些问题是相关的,但我不认为它们是重复的。