【问题标题】:Why do we use flatten? How is it different from flatMap?为什么我们使用扁平化?它与平面地图有什么不同?
【发布时间】:2018-10-31 12:45:19
【问题描述】:

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

【问题讨论】:

标签: scala flatmap


【解决方案1】:

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]

flatMap 的应用不仅限于收藏,而是更普遍。它派上用场的另一个例子是期货。假设我们没有可选的 id 而是一个 Future[String] ,它表示最终将产生 id 的计算。我们还有一个方法可以为我们提供一个Future[Record] 的 id。我们现在可以像这样从Future[String] 获取Future[Record]

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

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

【讨论】:

    猜你喜欢
    • 2017-10-13
    • 2014-09-30
    • 1970-01-01
    • 1970-01-01
    • 2016-11-09
    • 2014-03-15
    • 2018-10-26
    • 2021-10-01
    • 2017-08-30
    相关资源
    最近更新 更多