Java 使用CompletableFuture的异步计算,该函数在for each循环中返回一个对象

Java 使用CompletableFuture的异步计算,该函数在for each循环中返回一个对象,java,asynchronous,java-8,resttemplate,completable-future,Java,Asynchronous,Java 8,Resttemplate,Completable Future,我有一个RESTFul API,其响应包含很多字段。我需要在响应中添加额外的字段,我需要以异步方式从出站RESTFul API调用获取这些字段的值。我需要调用API的请求参数包含在列表中。在我的API流程中,有很多业务逻辑,涉及一些DB查询和一系列Java映射/列表操作,这些操作在我的List的每次迭代中都会发生。因此,当服务执行其BAU时,我需要一个子线程来执行出站API调用,提取我需要的信息,将其设置在对象B中,并携带B,我将在列表的每次迭代结束时在主线程中使用它 下面是我使用Complet

我有一个RESTFul API,其响应包含很多字段。我需要在响应中添加额外的字段,我需要以异步方式从出站RESTFul API调用获取这些字段的值。我需要调用API的请求参数包含在
列表中。在我的API流程中,有很多业务逻辑,涉及一些DB查询和一系列Java映射/列表操作,这些操作在我的
List
的每次迭代中都会发生。因此,当服务执行其BAU时,我需要一个子线程来执行出站API调用,提取我需要的信息,将其设置在对象B中,并携带B,我将在列表的每次迭代结束时在主线程中使用它

下面是我使用CompletableFuture.SupplySync()尝试的代码

for(A:listA){
//在迭代开始时
CompletableFuture asyncB=ioSvcObject.getRequiredFields(a.getReqParam1(),a.getReqParm2())
...
BAU就在这里。。
//在迭代的末尾
if(null!=asyncB.get()){
..将数据从B设置为响应对象。。
}
}
现在,我的ioSvcObject.getRequiredFields()方法如下所示:

public CompletableFuture<B> getRequiredFields(String param1, String param2){
return CompletableFuture.runAsync(() -> getAPIResponseObj(param1, param2)).thenApply(obj -> getB(obj));

}
private D getAPIResponseObj(String param1, String param2){
//calls the API using restTemplate.exchange()
return D;
}
private B getB(D d){
//gets the required fields from d and sets it to B and returns B
return B;
}
public CompletableFuture getRequiredFields(字符串param1,字符串param2){
返回CompletableFuture.runAsync(()->getAPIResponseObj(param1,param2)),然后应用(obj->getB(obj));
}
私有D getAPIResponseObj(字符串param1,字符串param2){
//使用restemplate.exchange()调用API
返回D;
}
私人乙(丁){
//从d中获取所需字段,并将其设置为B并返回B
返回B;
}

虽然我希望在调用
asyncB.get()
之前,B可以在asyncB中使用,但我不能排除在get()上等待/阻塞的可能性。只是好奇,是否有更好的方法来做到这一点,而不曾阻塞。请建议是否可以做得更好。谢谢。

这是否回答了您的问题?不是真的。我无法将我的担忧与那个解决方案联系起来。
public CompletableFuture<B> getRequiredFields(String param1, String param2){
return CompletableFuture.runAsync(() -> getAPIResponseObj(param1, param2)).thenApply(obj -> getB(obj));

}
private D getAPIResponseObj(String param1, String param2){
//calls the API using restTemplate.exchange()
return D;
}
private B getB(D d){
//gets the required fields from d and sets it to B and returns B
return B;
}