将CompletableFuture的结果传递给另一个

时间:2019-01-29 04:10:05

标签: java concurrency completable-future

我对Java的CompletableFuture相对缺乏经验,我可能需要一些帮助。这就是我想要做的。

/* I want to use the result of the future in a second one.
 * So basically, what I want to do is to return the second future,
 * but I don't want to block and wait for the first future to complete.
 * /
CompletableFuture<TypeA> -> CompletableFuture<TypeB> 

所以我想知道是否有一种方法可以将第一个期货“链接”到第二个期货,以便返回一个单一的future(TypeB)。

2 个答案:

答案 0 :(得分:2)

thenCompose方法正是这样做的。

这里是https://www.baeldung.com/java-completablefuture的示例:

CompletableFuture<String> completableFuture 
  = CompletableFuture.supplyAsync(() -> "Hello")
    .thenCompose(s -> CompletableFuture.supplyAsync(() -> s + " World"));

assertEquals("Hello World", completableFuture.get());

还可以看看difference between thenCompose and thenComposeAsync

答案 1 :(得分:0)

我们在尝试编写测试代码时遇到了类似的问题,并且必须测试的未来是在后台线程中创建的,因此我们不能简单地将它与我们想用于断言的外部未来。

我的同事创建了以下方法。

static <U> void propagateResultWhenCompleted(
    final CompletionStage<U> source,
    final CompletableFuture<U> target)
{
    source.whenComplete((r, t) -> complete(target, r, t));
}

我想知道为什么这不在标准工具集中。这当然不是使用期货的惯用方式,但在某些情况下很方便。