2015-08-18 76 views
4

鑑於Order對象列表的順序...斯卡拉:更有效的方式來篩選列表和創建的期貨

case class Order(val id: String, val orderType: Option[String]) 
case class Transaction (val id: String, ...) 

val orders = List(Order(1, Some("sell")), Order(2, None), ...) 

...我需要爲所有這些訂單創建的Future個序列具有一個類型(即orderType定義):

val transactions: Seq[Future[Transaction]] = orders.filter(
    _.orderType.isDefined).map { case order => 
    trxService.findTransactions(order.id) // this returns a Future[Transaction] 
    } 
) 

以上首先調用filter的代碼,它創建僅包含與orderType集到Some訂單新List ,然後從中創建一個Future的序列。有沒有更有效的方法來實現這一點?

回答

8

可以使用聚合filtermapcollect

val transactions: Seq[Future[Transaction]] = orders.collect { 
    case order if order.orderType.isDefined => trxService.findTransactions(order.id) 
}