我将如何处理未来[用户]与未来[选项[用户]]



你如何处理未来[用户]和未来[选项[用户]]有什么区别?

我也很困惑,因为我认为flatMap删除了选项,但这仅限于它们在集合中吗?

不,flatMap 不会删除Option 。这是一个错误但普遍的信念,因为从OptionTraversable的隐含转换允许你做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 同步等待将来的终止以获取解包值,但这通常没有多大意义(因为您正在阻止当前线程(。

最好将onCompleteonSuccess回调添加到您的未来(这将接收解包的未来结果作为参数(:

 val userFuture: Future[Option[User]] = Future { getUserOption() }
 userFuture.onSuccess {
    case userOpt:Option[User] => userOpt.foreach {  user =>
       println(user)  // watch out for thread-safety here!
    }    
 }

相关内容

  • 没有找到相关文章