2017-04-06 96 views
0

打交道时,如何在换补偿处理的可选值,我有对COMPR看起来像:与期货

for { 
    user <- getFutureUser(1) // Future[User] 
    account <- getFutureAccount(1) // Future[Account] 
    historyOpt <- ??? 
} yield Wrapper(user, account, historyOpt) 

case class Wrapper(user: User, account: Account, historyOpt: Option[History]) 

我被困在如何处理historyOpt值。 我有一个方法来获得历史:

def getHistory(id: Int): Future[History] 

但是这是基于用户的,如果user.getHistory是真的,那么我返回它,否则它是无。

我试过,但它是错误的:

for { 
    user <- getFutureUser(1) // Future[User] 
    account <- getFutureAccount(1) // Future[Account] 
    historyOpt <- if(user.getHistory) getFutureHistory(1) else Future.successful(None) 
} yield Wrapper(user, account, historyOpt) 

我该如何处理这之情况?

+0

什么'Wrapper'的第三个参数的类型? '历史'或'选项[历史]'? –

+0

这是选项[历史] – Blankman

+0

您是否正在使用Scalaz?我最近一直在读Monad Transformers,听起来它可能会帮助你的情况:https://www.47deg.com/blog/fp-for-the-average-joe-part-2-scalaz-monad-transformers/ – Quy

回答

1

快速回答:

case class User(getHistory: Boolean) 
case class Account() 
case class History() 

def getFutureUser(x: Int): Future[User] = ??? 
def getFutureAccount(x: Int): Future[Account] = ??? 
def getFutureHistory(x: Int): Future[History] = ??? 

case class Wrapper(user: User, account: Account, historyOpt: Option[History]) 

val a: Future[Wrapper] = for { 
    user <- getFutureUser(1) // Future[User] 
    account <- getFutureAccount(1) // Future[Account] 
    historyOpt <- if(user.getHistory) getFutureHistory(1).map(Some.apply) else Future.successful(None) 
} yield Wrapper(user, account, historyOpt) 
+0

我得到一个未来[任何] – Blankman

+0

@Blankman我已经发布完整的代码片段,请再次尝试并发布编译器给您的错误。 –

+0

谢谢你的代码工作,我的不。试图找出原因! – Blankman