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

Scala 我将如何处理未来的[用户]与未来的[选项[用户]?,scala,concurrent.futures,Scala,Concurrent.futures,您处理未来[用户]与未来[选项[用户]]的方式有什么不同 我也有点困惑,因为我认为平面图会删除选项,但这仅限于它们在集合中吗?否,flatMap不会删除选项。这是一个错误但常见的观点,因为存在从选项到可遍历的隐式转换,允许您执行列表(选项(1)).flatMap(x=>x)(本质上是.flatte) 相反,可以用与Monad更相似的方法来思考flatMap。给定某种类型的M[\u]和一个类型为a=>M[B]的函数,生成一个M[B]。因此,在这种情况下,flatMap要为您工作,您必须为某些类型的

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


我也有点困惑,因为我认为平面图会删除选项,但这仅限于它们在集合中吗?

否,
flatMap
不会删除
选项。这是一个错误但常见的观点,因为存在从
选项
可遍历
的隐式转换,允许您执行
列表(选项(1)).flatMap(x=>x)
(本质上是
.flatte

相反,可以用与Monad更相似的方法来思考
flatMap
。给定某种类型的
M[\u]
和一个类型为
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
您可以使用
wait
同步等待将来的终止,以获取未包装的值,但这通常没有多大意义(因为您正在阻塞当前线程)

最好将
onComplete
onSuccess
回调添加到您的future(它将接收未包装future的结果作为参数):


我希望Option[User]作为我的最终结果。我不太确定“像处理更类似于Monad的东西一样思考flatMap”是否是正确答案,因为有人认为
flatMap
是“删除”
Option
@ziggystar你怎么说?最大的问题是愚蠢的隐式转换。它确实在许多方面混淆了这个问题。@coolbreeze摆脱
未来的唯一方法是使用
wait
Future
不是一个集合。它代表了未来某个时刻将存在的价值。在play应用程序中,您是否会将未来传递到查看页面?我的意思是你必须在某个点阻塞,对吗?你是什么意思?注意这里的线程安全?在播放应用程序中,这怎么会是个问题?@coolbreeze请记住,Future的主体和回调可能在不同的线程中执行。不幸的是,我不熟悉游戏,因此无法判断游戏的哪些部分可能是线程不安全的。
 val userFuture: Future[Option[User]] = Future { getUserOption() }
 userFuture.onSuccess {
    case userOpt:Option[User] => userOpt.foreach {  user =>
       println(user)  // watch out for thread-safety here!
    }    
 }