您处理未来[用户]与未来[选项[用户]]的方式有何不同?
我也很困惑,因为我认为flatMap会删除选项,但这是否仅限于它们在集合中?
答案 0 :(得分:1)
不,flatMap
不会删除Option
。这是一个错误但常见的信念,因为存在从Option
到Traversable
的隐式转换,允许您执行List(Option(1)).flatMap(x => x)
(基本上.flatten
之类的事情。 )
相反,想象flatMap
就像对待Monad一样的事情。给定某种类型M[_]
和类型A => M[B]
的函数会产生M[B]
。因此,在这种情况下,flatMap
可以为您工作,对于某些类型Option[User] => Future[B]
,您必须具有B
类型的函数。
def doSomething(ouser: Option[User]): Future[Output] = { ...
val res: Future[Output] = futOptUser.flatMap(doSomething)
答案 1 :(得分:1)
我建议您阅读并理解docs。
简而言之,没有阻止你可以:
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!
}
}