我使用未来创建三个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