如何避免调用CompletableFuture.thenCompose(x-> x)?

时间:2018-07-06 20:42:31

标签: java completable-future

我感到自己在滥用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()转换为同步值。

有没有办法避免陷入这种模式?

0 个答案:

没有答案