gpt4 book ai didi

scala - 使用返回期权 future 的函数映射后,展平期权的 future

转载 作者:行者123 更新时间:2023-12-04 23:41:30 25 4
gpt4 key购买 nike

我有一个类型为 Future[Option[String]] 的集合我将它映射到一个返回 Future[Option[Profile]] 的函数,但这会创建返回类型 Future[Option[Future[Option[Profile]]]]因为 queryProfile返回类型是`Future[Option[Profile]]'

val users: Future[Option[User]] = someQuery
val email: Future[Option[String]] = users map(opSL => opSL map(_.email) )
val userProfile = email map {opE => opE map {E => queryProfile(E)}}

我需要使用 Profile物体包含在深处 val userProfile如果不打开所有这些关卡,正确的使用方法是什么 flatMap或“扁平化”,还是有更好的方法?

最佳答案

您可以通过以下方式获得“部分 future ”:

  val maybeProfile: Future[Profile] = users
.collect { case Some(u) => u.email }
.flatMap { email => queryProfile(email) }
.collect { case Some(p) => p }

现在 maybeProfile包含(完全“裸”/未包装) Profile实例,但前提是它能够找到它。您可以 .map像往常一样用它做其他事情,这会以通常的方式工作。

如果你想阻塞并等待完成,你将不得不在某个时候处理丢失的情况。例如:
   val optionalProfile: Option[Profile] = Await.result(
maybeProfile
.map { p => Some(p) } // Or just skip the last `collect` above
.recover { case _:NoSuchElementException => None },
1 seconds
)

如果您对拥有 Future[Option[Profile]] 感到满意,并且希望拥有“解开”魔法,并在一个地方处理丢失的案例,您可以将上面的两个片段放在一起,如下所示:
val maybeProfile: Future[Option[Profile]] = users 
.collect { case Some(u) => u.email }
.flatMap { email => queryProfile(email) }
.recover { case _:NoSuchElementException => None }

或使用 Option.fold就像另一个答案建议的那样:
val maybeProfile: Future[Option[Profile]] = users
.map { _.map(_.email) }
.flatMap { _.fold[Future[Option[Profile]]](Future.successful(None))(queryProfile) }

就个人而言,我发现最后一个选项不太可读。

关于scala - 使用返回期权 future 的函数映射后,展平期权的 future ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36037603/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com