2017-04-06 95 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