2015-06-18 47 views
1

鑑於返回Future以下方法...斯卡拉:如何處理序列在未來的理解

def getProducts: Future[List[Product]] = { ... } 
def sendOrder(p: Product, n: Int): Future[Order] = { ... } 

...我需要調用sendOrdergetProducts,並在返回的每個產品結束yield加工產品數量:

for { 
    products <- getProducts 
    // how do I iterate thru products and invoke sendOrder for each element? 
    ... 
} yield products.length 

如何應對產品清單中的上述理解?

編輯

事情變得更復雜,因爲我需要sendOrder之前調用第三種方法當且僅當getProducts實際上返回一個非空列表:

def doSomethingBeforeSendingOrder: Future[String] = { ... } 

for { 
    p <- getProducts 
    // how do I invoke doSomethingBeforeSendingOrder before sendOrder and 
    // only if getProducts actually returns a nonEmptylist? 
    o <- Future.sequence(p.map(senderOrder(_,IDontKnowWhatThisIntMeans))) 
} yield o.length 

回答

3

我感受不到第二個arg發送訂單應該來自哪裏,但基本上你想要做的是這樣的:

for { 
    p <- getProducts 
    if p.nonEmpty 
    _ <- someOtherMethodThatReturnsAFuture 
    o <- Future.sequence(p.map(senderOrder(_,IDontKnowWhatThisIntMeans))) 
} yield o.length 

Future.sequence會變成你的名單[未來[訂購]成未來[列表[訂購]

+0

第二arg爲項目發送的只是數......但在這裏它只是一個細節; - )現在的問題是,如何在* sendOrder之前調用另一個方法,並且只有getProducts實際返回一個非空列表(請參閱我的更新後的文章)? – j3d

+0

我更新了包含過濾器的答案/ if – melps

+0

完美,謝謝;-) – j3d