我使用未來創建三個actor任務,然後在完成時嘗試收集所有三個任務。 當前的代碼如下:Scala Future with Option()
implicit val timeout = Timeout(5.seconds)
val result1 = actor1 ? DataForActor(data)
val result2 = actor2 ? DataForActor(data)
val result3 = actor3 ? DataForActor(data)
val answer = for {
a <- result1.mapTo[List[ResultData]]
b <- result2.mapTo[List[ResultData]]
c <- result3.mapTo[List[ResultData]]
} yield (a ++ b ++ c).sorted
answer onComplete {
case Success(resultData) =>
log.debug("All actors completed succesffully")
successActor ! SuccessData(resultData.take(2))
case Failure(resultData) =>
log.info("actors failed")
}
每個參與者(actor1,actor2,actor3)操縱數據並返回無或選項(列表(resultData)),如圖所示在下面的代碼的:
val resultData = if(data.size == 0) None else {
data.map {
...
try {
... //manipulation on resultData
Option(resultData)
}
catch {
case e: Exception => None
}
}.flatten
}
for語句連接來自每個actor的列表,並生成一個long List(resultData)。
我希望在一個actor返回None的情況下,它的結果是for語句不會向串聯添加任何內容,即List()。
一個例子:
如果我得到: RESULT1 =列表(1,2,3), RESULT2 =無, result3 =列表(4,5),
我想: resultData =列表(1,2,3,4,5)
嘗試在任何情況下,返回同一類型。您應該返回'Nil'而不是'None'或使用'Option [List [ResultData]]'。 – senia 2014-12-02 09:04:32