2015-05-07 50 views
0

鑑於方法Map存儲從歐元/美元BTC匯率...斯卡拉:如何結合返回一個Future

val btcRates = Map("EUR" -> 0.0036, "USD" -> 0.0045) 

...和以下兩種方法...

// returns a Future containing a Map of value to convert to BTC 
def getAmounts = Future(Map("EUR" -> 500.0, "USD" -> 550.0, "CHF" -> 400)) 

// returns a Future containing the exchange rate for the specified currency 
def getBtcRate(refCurrency: String) = Future(btcRates(refCurrency)) 

如何調用getAmounts,然後對Map的每個元素返回調用getBtcRate將金額轉換爲BTC?我如何總結所有轉換的金額?

def getTotal: Future[Double] = { 
    getAmounts.flatMap { _.map { case (currency, amount) => 
    getBtcRate(currency).flatMap { rate => 
     amount * rate // how do I sum this and how do I return the result? 
    } 
    }} 
} 
+0

什麼是「利率」和「refCurrency」? – Brian

+0

是的......對不起,他們是兩個錯別字...只是修好了。 – j3d

+0

我會用你的樣本數據添加預期的輸出。另外,我不確定我會在'未來'中爲'getAmounts'放置一個'Map'。這似乎不符合「未來」的精神,它是一個「可以爲尚不存在的結果創建的佔位符對象」。 – Brian

回答

3

我用換修真getTotal,因爲它是對眼睛比flatmap個鏈變得更輕鬆:

def getTotal: Future[Double] = for { 
    amounts <- getAmounts 
    totals <- Future.sequence(
     amounts.map { case (currency, amount) => 
     getBtcRate(currency).map(rate => amount * rate) 
     } 
    ) 
    } yield totals.sum 

這裏做的事情是,amounts的結果是getAmounts(這真的是你的flatmap的主體)。然後,您通過調用getBtcRate來爲每個currency映射該元組以創建一系列期貨。然後將這些期貨中的每一個映射到總和。

現在你有一個Iterable[Future[Double]]和使用Future.sequence你改造成一個Future[Iterable[Double]]

現在,你可以得到的是Iterablesum它,得到所需的Future[Double]

+0

非常感謝你......我錯過了'Future.sequence'的東西;-) – j3d