Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何处理列表中每个未来的结果,以及何时在vert.x中完成所有未来?_Java_Asynchronous_Future_Vert.x - Fatal编程技术网

Java 如何处理列表中每个未来的结果,以及何时在vert.x中完成所有未来?

Java 如何处理列表中每个未来的结果,以及何时在vert.x中完成所有未来?,java,asynchronous,future,vert.x,Java,Asynchronous,Future,Vert.x,我有一个未来的列表,需要在每个未来完成时处理结果。一旦所有的未来都完成了,我需要撰写一份回复 创建期货及其处理程序列表的简化代码: final List<Future<MyResponse1>> futureMyResponse1Lst = new ArrayList<>(); for (final MyObject1 obj1: listOfObject1) { final Future<MyResponse1>

我有一个
未来的
列表
,需要在每个
未来
完成时处理结果。一旦所有的未来都完成了,我需要撰写一份回复

创建期货及其处理程序列表的简化代码:

    final List<Future<MyResponse1>> futureMyResponse1Lst = new ArrayList<>();
    for (final MyObject1 obj1: listOfObject1) {
        final Future<MyResponse1> resp1Future = myRestClient.getMyResponse1(obj1);

        resp1Future .setHandler(new Handler<AsyncResult<MyResponse1>>() {

            @Override
            public void handle(final AsyncResult<MyResponse1> event) {
                final MyResponse1 resp1= event.result();
                handleResponse1(obj1, resp1);
            }

        });
        futureMyResponse1Lst.add(resp1Future );
    }
我发现的所有问题和答案都建议使用CompositeFuture,但在这种情况下,不会调用未来的单一处理程序


如何在每个
Future
结果上调用一个处理程序,并在所有Future都完成时另外调用一个处理程序?我对异步编程和Vert.x非常陌生,使用
CompositeFuture
是否正确?我应该改用
RxJava
?如何创建?

您可以创建一个将在原始Futures处理程序中完成的附加Future,并将该Future用于CompositeFuture

final List<Future<MyResponse1>> futureMyResponse1Lst = new ArrayList<>();
for (final MyObject1 obj1: listOfObject1) {
    final Future<MyResponse1> resp1Future = myRestClient.getMyResponse1(obj1);

    Future<MyResponse1> resp1FutureComposite = Future.future();
    resp1Future.setHandler(event-> {
            final MyResponse1 resp1= event.result();
            handleResponse1(obj1, resp1);
            resp1FutureComposite.compelete(resp1);
    });
    futureMyResponse1Lst.add(resp1FutureComposite);
}
final List futureMyResponse1Lst=new ArrayList();
对于(最终MyObject 1对象J1:ListoObject 1){
final Future resp1Future=myRestClient.getMyResponse1(obj1);
Future resp1FutureComposite=Future.Future();
resp1Future.setHandler(事件->{
最终MyResponse1 resp1=事件。结果();
手柄响应1(obj1,响应1);
resp1未来综合项目(resp1);
});
未来我的响应11添加(响应1未来组合);
}
如果您只关心成功的调用,并且不希望以后再处理错误(然后在CompositeFuture处理程序中处理),则可以改用compose方法:

final List<Future<MyResponse1>> futureMyResponse1Lst = new ArrayList<>();
for (final MyObject1 obj1: listOfObject1) {
    final Future<MyResponse1> resp1Future = myRestClient.getMyResponse1(obj1);

    Future<MyResponse1> resp1FutureComposite = resp1Future.compose(resp1 -> {
            handleResponse1(obj1, resp1);
            return Future.succeededFuture(resp1);
    });
    futureMyResponse1Lst.add(resp1FutureComposite);
}
final List futureMyResponse1Lst=new ArrayList();
对于(最终MyObject 1对象J1:ListoObject 1){
final Future resp1Future=myRestClient.getMyResponse1(obj1);
Future resp1FutureComposite=resp1Future.compose(resp1->{
手柄响应1(obj1,响应1);
返回未来。成功的未来(resp1);
});
未来我的响应11添加(响应1未来组合);
}

它成功了,谢谢,但遗憾的是,vert.x迫使我们做了一个变通办法,并为Future的基本用途编写了这样一个意大利面代码。
final List<Future<MyResponse1>> futureMyResponse1Lst = new ArrayList<>();
for (final MyObject1 obj1: listOfObject1) {
    final Future<MyResponse1> resp1Future = myRestClient.getMyResponse1(obj1);

    Future<MyResponse1> resp1FutureComposite = resp1Future.compose(resp1 -> {
            handleResponse1(obj1, resp1);
            return Future.succeededFuture(resp1);
    });
    futureMyResponse1Lst.add(resp1FutureComposite);
}