Java 8 CompletableFuture - 如何在同一输入上运行多个函数

Sef*_*ffy 4 java java-8 completable-future

我使用以下工作代码CompleteableFuture

CompletableFuture<SomeObject> future = CompletableFuture.
            supplyAsync( () -> f1() ).
            thenApplyAsync( f1Output -> f2( f1Output ) ).
            thenApplyAsync( f2Output -> f3( f2Output ) );
Run Code Online (Sandbox Code Playgroud)

是否有可能运行另一个接收f1Output类似以下内容的未来input?

CompletableFuture<SomeObject> future = CompletableFuture.
            supplyAsync( () -> f1() ).
            thenApplyAsync( f1Output -> f2( f1Output ) ).
            someApiThatRuns( f1Output -> f4( f1Output ) ). // <-- 
            thenApplyAsync( f2Output -> f3( f2Output ) );
Run Code Online (Sandbox Code Playgroud)

如果这简化了事情,人们可以忽略 . 返回的结果f4()

Did*_*r L 5

如果您不介意按顺序运行f2f4运行,最简单的方法就是在 lambda 中调用两者:

CompletableFuture<SomeObject> future = CompletableFuture.
            supplyAsync(() -> f1() ).
            thenApplyAsync(f1Output -> { f4(f1Output); return f2(f1Output); } ).
            thenApplyAsync(f2Output -> f3(f2Output));
Run Code Online (Sandbox Code Playgroud)

但是,如果您想f2并行运行f4,您可以将中间未来存储在变量中:

CompletableFuture<SomeObject> f1Future = CompletableFuture.supplyAsync(() -> f1());

CompletableFuture<SomeObject> future = f1Future.
            thenApplyAsync(f1Output -> f2(f1Output)).
            thenApplyAsync(f2Output -> f3(f2Output));

f1Future.thenAcceptAsync(f1Output -> f4(f1Output));
Run Code Online (Sandbox Code Playgroud)