我想以与JS中Promises相同的样式链接多个单独的操作。

所以目前我有这样的代码:

    CompletableFuture<Data1> data1 = ...;
    CompletableFuture<Data2> data2 = ...;

    // Fetch in parallel!
    CompletableFuture.allOf(
            data1,
            data2
    ).join(); // wait 2 threads to finish

    CompletableFuture<Data3> data3 = ... // i need data1 here
    data3.join();


是否可以将其重写为一个链?
有点儿:

CompletableFuture.allOf(
        data1,
        data2
)
.then((result1, result2) -> return another CompletableFuture)
.then(result3 -> { ...do other stuff here})

最佳答案

使用allOf时,无法在输入期货上调用join来获取依赖函数中的值(尽管您会知道这些调用不会阻塞)。

但是,当您恰好有两个期货要组合时,就不需要使用allOf了。您可以将它们顺利组合:

CompletableFuture<FinalResult> f = data1
    .thenCombine(data2, (result1, result2) -> another CompletableFuture)
    .thenCompose(Function.identity())
    .thenAccept(result3 -> …);


thenAccept将评估将结果值映射到新结果值的函数,而thenCompose将评估将结果值映射到新future的函数。方法thenCombinethenAccept的两个用途,允许将两个值映射到新值。

但是thenCombine并没有两个未来的变体,因此解决方案是将由两个中间值创建的未来当作一个值对待(获取未来的未来),然后使用thenCompose(Function.identity())映射“值”走向未来。然后,一旦将来完成,我们就可以链接一个函数来处理第三个结果。

10-06 05:55