在CompletableFuture执行中苦苦挣扎

时间:2016-09-03 23:37:22

标签: java future deferred completable-future

我遇到了一个问题,我需要连续进行多次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;
}

1 个答案:

答案 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());
}

.thenComposeCompletableFuture - 返回函数转换为另一个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;
}