我正在使用Future创建三个演员任务,然后在完成后尝试收集所有这三个任务。当前代码如下:
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")
}
每个参与者(acter1、actor2、actor3)操作数据并返回None或Option(List(ResultData)),如以下代码所示:
val resultData = if(data.size == 0) None else {
data.map {
...
try {
... //manipulation on resultData
Option(resultData)
}
catch {
case e: Exception => None
}
}.flatten
}
For语句连接来自每个参与者的列表,并生成一个长列表(ResultData)。
我希望在一个参与者返回NONE的情况下,它在for语句中的结果不会向连接中添加任何东西,即list()。
举个例子:
如果我得到:结果1=列表(1,2,3),结果2=无,结果3=列表(4,5),
我想要:ResultData=List(1,2,3,4,5)
1条答案
按热度按时间cgvd09ve1#
您可以在
mapTo
之前将None
替换为Nil
,方法如下:请注意,应避免使用
List
这样的泛型类型的mapTo
:由于类型擦除,
mapTo
不能证明您有Int
的列表,而不是其他类型的List
。在执行元的receive
方法中,case l: List[Int]
会遇到同样的问题。您应该为您的消息创建特殊类,如下所示: