可转换未来|然后应用 vs 然后计算

2022-08-31 07:04:03

我无法弄清楚 和 之间的区别。thenApplythenCompose

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

来自 Java 文档:

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

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

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

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

我明白了扩展完成阶段的第二个参数,没有。thenComposethenApply

有人可以提供一个例子,在这种情况下我必须使用以及何时使用?thenApplythenCompose


答案 1

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

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

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

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

答案 2

我认为@Joe C发布的答案具有误导性。

让我试着用一个例子来解释和之间的区别。thenApplythenCompose

假设我们有 2 个方法:和:getUserInfo(int userId)getUserRating(UserInfo userInfo)

public CompletableFuture<UserInfo> getUserInfo(userId)

public CompletableFuture<UserRating> getUserRating(UserInfo)

两种方法的返回类型都是 。CompletableFuture

我们要首先调用,并在完成后调用结果。getUserInfo()getUserRating()UserInfo

关于方法的完成,让我们同时尝试和 .区别在于返回类型:getUserInfo()thenApplythenCompose

CompletableFuture<CompletableFuture<UserRating>> f =
    userInfo.thenApply(this::getUserRating);

CompletableFuture<UserRating> relevanceFuture =
    userInfo.thenCompose(this::getUserRating);

thenCompose()其工作原理类似于 Scala 的 flatMap,它将嵌套期货扁平化。

thenApply()按原样返回嵌套的期货,但平展嵌套的期货,以便更轻松地将更多方法调用链接到它。thenCompose()CompletableFutures


推荐