我有3 scala.concurrent.Future
种不同的类型,需要在akka.dispatch.Futures.sequence
内组成它们,以便在所有期货完成时获得通知,期货被声明为:
Future<List<Request>> f1
Future<List<Offer>> f2
Future<Event> f3
我尝试将它们放在Iterable<Future<Object>>
中,声明为Iterable<Future<Object>> futureIterable = new ArrayList<>();
如下:
Iterable<Future<Object>> futureIterable = new ArrayList<>();
Future<Iterable<Future<Object>>> futureListOfInts=sequence(futureIterable,getContext().dispatcher());
我收到了这封编辑信息:
Error:(139, 67) java: incompatible types: inferred type does not conform to equality constraint(s)
inferred: scala.concurrent.Future<java.lang.Object>
equality constraints(s): scala.concurrent.Future<java.lang.Object>,java.lang.Object
答案 0 :(得分:0)
Futures.sequence
可以很好地转换Iterable[Future[A]]
中Future[Iterable[A]]
的{{1}}同一个tipe A
的对象。
等待&#34;等待&#34;对于不同Future
的完整性,更通用和惯用的方法是flatMap
,如下面的代码段所示:
final ExecutionContext ec = getContext().dispatcher();
public Future<Result> composeFutures(Future<List<Request>> f1, Future<List<Offer>> f2, Future<Event> f3) {
return f1.flatMap(new Mapper<List<Request>, Future<Result>>() {
@Override
public Future<Result> apply(List<Request> requestList) {
return f2.flatMap(new Mapper<List<Offer>, Future<Result>>() {
@Override
public Future<Result> apply(List<Offer> offers) {
return f3.map(new Mapper<Event, Result>() {
@Override
public Result apply(Event event) {
// use requestList, offers, event
// to have your result
// ...
return new Result();
}
}, ec);
}
}, ec);
}
}, ec);
}
正如您所看到的,composeFutures
方法将返回单个Future
,这将在f1
,f2
和f3
成功完成后完成。如果其中一个失败,将返回失败的未来。