当前位置: 首页 > 面试题库 >

CompletableFuture | thenApply与thenCompose

东明德
2023-03-14
问题内容

我无法理解thenApply()和之间的区别thenCompose()

那么,有人可以提供有效的用例吗?

从Java文档中:

thenApply(Function<? super T,? extends U> fn)

返回一个新值CompletionStage,当此阶段正常完成时,将使用该阶段的结果作为所提供函数的参数来执行该操作。

thenCompose(Function<? super T,? extends CompletionStage<U>> fn)

返回一个新值CompletionStage,当此阶段正常完成时,将以该阶段作为所提供函数的参数来执行此操作。

我得到thenCompose扩展的CompletionStage 的第二个参数,而thenApply没有扩展。

有人可以提供一个例子,说明我必须在什么情况下使用thenApply以及何时使用thenCompose


问题答案:

thenApply 如果您具有同步映射功能,则使用。

CompletableFuture<Integer> future = 
    CompletableFuture.supplyAsync(() -> 1)
                     .thenApply(x -> x+1);

thenCompose如果您具有异步映射函数(即返回a的函数CompletableFuture),则使用。然后它将直接返回带有结果的Future,而不是嵌套的Future。

CompletableFuture<Integer> future = 
    CompletableFuture.supplyAsync(() -> 1)
                     .thenCompose(x -> CompletableFuture.supplyAsync(() -> x+1));


 类似资料:
  • 我搞不清)和之间的区别。 那么,有人能提供一个有效的用例吗? 从Java文档中: 返回一个新的,当此阶段正常完成时,将以此阶段的结果作为所提供函数的参数执行该。 返回一个新的,当此阶段正常完成时,将以此阶段作为所提供函数的参数执行该。 我发现的第二个参数扩展了CompletionStage,而没有扩展CompletionStage。 谁能提供一个例子,在什么情况下我必须使用以及什么时候使用?

  • 问题内容: 假设我有以下代码: 案件: 这里输出将2.现在的情况: 我在这个博客中读到,每个步骤都是在单独的线程中执行的,并且“同时”执行(这意味着在先于结束之前先开始执行),如果是这样,那么如果第一步没有完成,那么第二步的输入参数值是多少? 如果第二步不采取措施,第一步的结果将流向何方?第三步将采取哪一步的结果? 如果第二步必须等待第一步的结果,那么意义何在? 这里x-> x + 1只是为了说明

  • 问题内容: 我有以下代码,该代码在远程服务器上安排任务,然后使用轮询完成。任务完成后,它将下载结果。我想将a返回给调用方,以便他们可以确定阻止时间和阻止时间,并为他们提供取消任务的选项。 我的问题是,如果客户端取消该方法返回的值,则块不会执行。如果我删除它。很明显,我对构图有些误解…我应该改变什么? 同样,如果我这样做: 代替 也永远不会执行。这对我来说似乎很违反直觉。从逻辑上说,返回应该不是我应

  • 这里的输出将是2。现在,对于: 我在这篇博客中读到,每个在一个单独的线程中执行,并且“同时”(这意味着在前面的完成之前启动)。如果是,如果第一步没有完成,第二步的输入参数值是什么? 如果没有第二步迈出,第一步的成果将何去何从?第三步会采取哪一步的结果?

  • 所以如果有谁能解释或指向我这样的博客或文章,那对我真的是好事。

  • 在Java8中,有两种启动异步计算的方法-和。这两者看起来相当相似-的内部类甚至扩展了。 有理由用一个代替另一个吗? 我看到的一个关键区别是,方法只是阻塞,直到将来完成(只是使用旋转),而可以从队列中窃取工作,以帮助您加入的任务完成。 有没有比这一个或那一个更好的好处?