Java 8 CompletableFuture - как запустить несколько функций на одном входе - PullRequest
1 голос
/ 26 июня 2019

У меня есть следующий рабочий код с использованием CompleteableFuture:

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

Возможно ли запустить другое будущее, которое получает f1Output как input? Что-то вроде:

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

Если это упрощает вещи, можно игнорировать результат, возвращаемый f4().

1 Ответ

2 голосов
/ 26 июня 2019

Если вы не против запустить f2 и f4 в последовательности, самое простое - просто вызвать оба в своей лямбде:

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

Если вы хотите запустить 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));
...