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

时间:2015-12-07 18:45:30

标签: scala concurrent.futures

您处理未来[用户]与未来[选项[用户]]的方式有何不同?

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

2 个答案:

答案 0 :(得分:1)

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

最好将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!
    }    
 }