为什么我们要使用压平?它与flatMap有何不同



在scala中,我们为什么要使用flatten?它与flatMap有何不同?涉及期货的例子将非常有用。

flatten不涉及flatMap的"映射"部分。可以把它看作是扁平化嵌套结构。Option[Option[Int]]变成仅仅是Option[Int],或者List[List[Int]]变成List[Int](通过连接各个列表的元素(。

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

Some(4).map(_ + 1) // evaluates to Some(5)

有时传递给map的函数会返回底层结构本身的一个实例。假设你有一个可选的id,如果设置了它,你想在数据库中查找它,而不知道是否存在记录,因此你的函数也会返回Option:

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

这通常不是你想要的。本质上,您有一个Option[Record],不需要额外的嵌套。所以你应该在map:之后立即调用flatten

optionalId.map(getRecord).flatten // evaluates to an Option[Record]

现在flatMap本质上是两种方法的结合:

optionalId.flatMap(getRecord) // also yields an Option[Record]

CCD_ 15的应用不仅限于集合,而且更为普遍。另一个有用的例子是期货。假设我们没有一个可选的id,而是一个Future[String],它表示一个最终会产生id的计算。我们还有一个方法,为id提供Future[Record]。我们现在可以从Future[String]中获得Future[Record],如下所示:

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

相关内容

  • 没有找到相关文章

最新更新