【问题标题】:Chain few CompletableFuture operations链几个 CompletableFuture 操作
【发布时间】:2023-03-31 03:27:02
【问题描述】:

我想以与 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})

【问题讨论】:

    标签: java completable-future


    【解决方案1】:

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

    但是,当您恰好有两个期货要组合时,没有必要使用allOf;您可以将它们顺利组合:

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

    thenAccept 将评估将结果值映射到新结果值的函数,而thenCompose 将评估将结果值映射到新未来的函数。方法thenCombinethenAccept 的两个未来变体,允许将两个值映射到一个新值。

    但是thenCombine 没有两个future 的变体,所以解决方案是把从两个中间值创建的future 当作一个值(得到future 的future),然后thenCompose(Function.identity()) 来映射对未来的“价值”。然后,一旦 future 完成,我们就可以链接一个函数来处理第三个结果。

    【讨论】:

      【解决方案2】:

      CompletableFuture.allOf(...) 返回一个CompletableFuture&lt;Void&gt;。它对 givne CompletableFutures 将返回的类型一无所知:

      给定CompletableFutures 的结果(如果有)不会反映在返回的CompletableFuture 中,但可以通过单独检查它们来获得。

      所以如果你想使用它们,你必须get data1data2 的返回值。

      【讨论】:

        猜你喜欢
        • 2015-01-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-10-12
        相关资源
        最近更新 更多