我可以在CompletableFuture上多次使用thenCombine / thenCompose吗?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了我可以在CompletableFuture上多次使用thenCombine / thenCompose吗?相关的知识,希望对你有一定的参考价值。

假设我有CompletableFutures A,B和C是可运行的。 B取决于A和C取决于A和B,我可以做A然后组合B和B然后组合A所以C得到A和B的值,即使B依赖于A的值也?

基本上我要问的是 - 有没有办法获得像这样的CompletableFuture管道:

A -- B -- C
  -------^

CompletableFuture<String> A = CompletableFuture.supplyAsync(() -> return "Hello");
CompletableFuture<String> B = A.thenApplyAsync(stringA -> return stringA + "World");
B.thenCombine(A, (stringA, StringB) -> doStuffWithAAndB(stringA, stringB));

希望这是有道理的。

答案

这样做完全没问题。如何将CompletableFutures组合在一起没有任何限制。

确保它们最终完成是您的责任,但这不是问题。

或者,您可以直接从回调访问A,如下所示:

CompletableFuture<String> a = CompletableFuture.supplyAsync(() -> return "Hello");
CompletableFuture<String> b = a.thenApplyAsync(stringA -> return stringA + "World");
b.thenApply(stringB -> doStuffWithAAndB(a.join(), stringB));

但这确实是一个偏好问题。

另一答案

如果你可以使用RxJava2,你可以这样做:

import io.reactivex.Observable;

public class CompletableFutureDemo {

    public static void main(String[] args) {

        CompletableFuture<String> a = CompletableFuture.supplyAsync(() -> "Hello");
        Observable<String> obsA = Observable.fromFuture(a);

        Observable<String> obsB = obsA.map(stringA -> stringA + " world");

        Observable.zip(obsA, obsB, (stringA, stringB) -> {
            return stringA + " " + stringB;
        })
        .subscribe(zipped -> {
            System.out.println(zipped);
        });
    }

以上是关于我可以在CompletableFuture上多次使用thenCombine / thenCompose吗?的主要内容,如果未能解决你的问题,请参考以下文章

单核机器上的 CompletableFuture

Mono vs CompletableFuture

Java8 CompletableFuture 用法全解

JUC-Java多线程Future,CompletableFuture

是否可以安排 CompletableFuture?

CompletableFuture详解2