我遇到了一个问题,我需要连续进行多次API调用并返回特定的对象类型。
我不能完全理解我应该如何解决这个问题来完善CompletableFuture。 getSomeDetails
的返回类型必须是ObjectB,但在我接触到具有附加数据的ObjectA之前,我无法返回。
采用这种方法的有效方法是什么?
public CompletableFuture<ObjectB> getSomeDetails(String someIdentifier) {
// I need to return details from ObjectB (getObjectBDetails)
// But can only get those, after getting ObjectA, which has additional data.
}
public CompletableFuture<ObjectA> getObjectADetails(String someIdentifier) {
return ObjectA;
}
public CompletableFuture<ObjectB> getObjectBDetails(ObjectA) {
ObjectB = someService.get(ObjectA.someImportantProperty)
return objectB;
}
答案 0 :(得分:0)
你大部分都在那里:怎么样
import static java.util.concurrent.CompletableFuture.completedFuture;
public CompletableFuture<ObjectA> getObjectADetails(String someIdentifier) {
return completedFuture(new ObjectA(someIdentifier));
}
public CompletableFuture<ObjectB> getObjectBDetails(ObjectA a) {
return completedFuture(new ObjectB(a));
}
public CompletableFuture<ObjectB> getSomeDetails(String someIdentifier) {
return getObjectADetails(someIdentifier)
.thenCompose(this::getObjectBDetails);
}
public void run() throws Exception {
System.out.println(getSomeDetails("request").get().toString());
}
.thenCompose
将CompletableFuture
- 返回函数转换为另一个CompletableFuture
(又名“flatMap”)。如果.getObjectBDetails
仅返回ObjectB
,则您使用.thenApply
(又名“地图”)。
我正在使用.completedFuture()
作为示例,但对于您创建的有意义的异步工作&amp;返回一个(未完成的)CompletableFuture
,然后从另一个线程完成它。例如
public CompletableFuture<ObjectB> getObjectBDetails(final ObjectA a) {
final CompletableFuture<ObjectB> promise = new CompletableFuture<>();
new Thread(() -> {
// work to be done.. then:
promise.complete(a);
}).start();
return promise;
}