当前位置: 首页 > 知识库问答 >
问题:

链少可完成未来操作

空慈
2023-03-14

我有几个单独的操作,我想以与JS中的promise相同的风格链接这些操作。

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

    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})

共有2个答案

蒙光华
2023-03-14

CompletableFuture.allOf(…)返回CompletableFuture

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

因此,如果要使用 data1data2 的返回值,则必须获取它们。

岳玉堂
2023-03-14

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

但是,当您正好有两个期货要组合时,就没有必要使用< code > allOf ;您可以顺利地将它们结合起来:

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

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

thenCombine没有两个未来变体,因此解决方案是将由两个中间值创建的未来视为一个值(获取未来的未来),然后thenCompose(Function.identity())来将“值”映射到未来。然后,在未来完成后,我们可以链接一个函数来处理第三个结果。

 类似资料:
  • 我正在尝试将方法的调用/结果链接到下一个调用。我得到了编译时错误方法,因为if无法从前一次调用中获得objB的引用。 如何将上一次调用的结果传递给下一个链?我是不是完全误解了这个过程?

  • 我要做的是异步计算树结构的深度,我将有树的第一层,我想启动一个异步线程来分别计算每个节点的深度。 在计算过程中,树中显然可能有一个分叉,在这一点上,我想踢一个额外的线程来计算那个分支。 我已经得到了这个工作,但我需要做一些整理逻辑,当所有这些未来完成。但我对这一过程中产生的额外的可完成的未来感到困扰。 我会用什么方法来保存所有开始的CompletableFutures+那些动态创建的,并且在执行任

  • 问题内容: 我尽力而为,但没有找到任何文章和博客可以清楚地比较和,并且提供了很好的分析。 因此,如果任何人都可以向我解释或指向这样的博客或文章,那对我来说真的非常好。 问题答案: 无论 ListenableFuture 和 CompletableFuture 有超过它的父类的优势 未来 通过允许呼叫者在这样或那样的回调“注册”当异步动作已经完成被调用。 使用 Future, 您可以执行以下操作:

  • 问题内容: 我正在使用Java 8可完成的期货。我有以下代码: 我使用runAsync计划执行等待闩锁的代码。接下来,我取消了将来,希望将被中断的异常抛出内部。但是似乎线程在await调用上仍然处于阻塞状态,即使将来被取消(断言通过)也永远不会抛出InterruptedException。使用ExecutorService的等效代码可以正常工作。是CompletableFuture中的错误还是我的

  • 如果一个字段在可完成的未来代码中为空,我必须发送一个异常: 这个想法是,如果孩子的字段为空(在本例中为lastName),我必须抛出一个自定义异常,我不太确定如何实现这一点。 我的想法是使用thenAccept方法发送异常,如下所示: 我必须评估数据库中的lastName是否为空,我必须抛出一个异常。 有什么想法吗?

  • 我有一个实例列表。 如何将他们转变成这样一个未来: