你如何处理未来[用户]和未来[选项[用户]]有什么区别?
我也很困惑,因为我认为flatMap删除了选项,但这仅限于它们在集合中吗?
不,flatMap
不会删除Option
。这是一个错误但普遍的信念,因为从Option
到Traversable
的隐含转换允许你做List(Option(1)).flatMap(x => x)
(本质上是.flatten
(之类的事情。
相反,flatMap
像对待更类似于Monad的东西一样看待。给定某种类型M[_]
和类型 A => M[B]
的函数产生M[B]
。因此,在这种情况下,要使flatMap
为您工作,您必须为某些类型B
具有 Option[User] => Future[B]
类型的函数。
def doSomething(ouser: Option[User]): Future[Output] = { ...
val res: Future[Output] = futOptUser.flatMap(doSomething)
我建议您阅读并理解文档。
简而言之,在不阻止的情况下,您可以:
- 转换未来的结果(使用
map
( - 合并多个期货的结果(使用
flatMap
( - 添加完成回调(使用
onComplete
(
您可以使用 Await
同步等待将来的终止以获取解包值,但这通常没有多大意义(因为您正在阻止当前线程(。
最好将onComplete
或onSuccess
回调添加到您的未来(这将接收解包的未来结果作为参数(:
val userFuture: Future[Option[User]] = Future { getUserOption() }
userFuture.onSuccess {
case userOpt:Option[User] => userOpt.foreach { user =>
println(user) // watch out for thread-safety here!
}
}