我感到自己在滥用CompletableFuture API。
调用CompletableFuture.exceptionally()
时,我通常会发现自己需要调用另一个异步过程,这意味着exceptionally()
返回CompletableFuture<CompletableFuture<T>>
而不是CompletableFuture<T>
。然后,我使用thenCompose(x -> x)
返回结果。
这是一个具体的例子:
CompletableFuture<Void> listenersNotified = CompletableFuture.supplyAsync(() ->
{
int result = expensiveOperation();
List<CompletionStage<Void>> futures = new ArrayList<>();
for (EventListener listener: listeners)
listener.onSuccess(result);
return futures;
}).thenCompose(futures -> CompletableFuture.allOf(futures)).
exceptionally((exception) ->
{
List<CompletionStage<Void>> futures = new ArrayList<>();
for (EventListener listener: listeners)
futures.add(listener.onError(result));
return CompletableFuture.allOf(futures);
}).thenCompose(x -> x);
我了解到,在上面的示例中,可以从return futures
内部exceptionally()
并将thenCompose()
移动到exceptionally()
之后,这是可行的,但实际上我不知道并非总是希望对thenSupply()
的结果应用相同的功能。我希望每个部分都将其自己的返回类型从exceptionally()
转换为同步值。
有没有办法避免陷入这种模式?