【问题标题】:Struggling with CompletableFuture execution在 CompletableFuture 执行中苦苦挣扎
【发布时间】:2016-09-03 23:37:21
【问题描述】:

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

【问题讨论】:

    标签: java future deferred completable-future


    【解决方案1】:

    你大部分时间都在那里:怎么样

    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-returning 函数转换为另一个 CompletableFuture(又名“flatMap”)。如果.getObjectBDetails 只返回一个ObjectB,您将使用.thenApply(又名“地图”)。

    我使用.completedFuture() 作为示例,但对于有意义的异步工作,您将创建并返回一个(未完成的)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;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-21
      • 2014-05-11
      • 2013-02-20
      • 1970-01-01
      相关资源
      最近更新 更多