繁体   English   中英

返回 CompletableFuture<Void> 在条件函数中

[英]Returning CompletableFuture<Void> in a conditional function

我有一个用例,我必须从一个函数返回一个CompletableFuture<Void> ,该函数根据一个条件组成 2 个 Completable Futures。

以下是我现在所拥有的-

private CompletableFuture<Void> processSomething(final SomeEvent event) {
    final CompletableFuture<PaginatedQueryList<Detail>> detail = dao.getData(event.getOrderId());
    return detail.thenApply(n -> n.stream()
        .filter(i -> i.getBusinessType().equals(BusinessType.AWESOME))
        .findFirst()
        .filter(i -> i.getLastUpdateEventTimestamp() <= event.getCreationTime())) // This returns Optional<Detail>
        .thenCompose(i -> i
           .map(o -> deleteItem(event,o))
           .orElse(CompletableFuture.completedFuture(null))); // deleteItem is a async call that returns CompletableFuture<Void>
}

社区可以检查并建议任何其他方法吗?
我特别不喜欢明确返回CompletableFuture.completedFuture(null)

thenCompose的函数中返回一个已经完成的未来并没有错。 正如在这个答案中提到的,您还可以使用CompletableFuture.allOf()来表示一个空的任务列表,以获得相同的结果。

但是你可以使用.orElseGet(() -> …)来避免在不需要时提前构建完整的未来。

此外,您可以将thenApply(…).thenCompose(…)链替换为单个thenCompose(…)

private CompletableFuture<Void> processSomething(final SomeEvent event) {
    CompletableFuture<PaginatedQueryList<Detail>> detail = dao.getData(event.getOrderId());
    return detail.thenCompose(n -> n.stream()
        .filter(i -> i.getBusinessType().equals(BusinessType.AWESOME))
        .findFirst()
        .filter(i -> i.getLastUpdateEventTimestamp() <= event.getCreationTime())
        .map(o -> deleteItem(event, o))
        .orElseGet(() -> CompletableFuture.completedFuture(null)));
// or   .orElseGet(() -> CompletableFuture.allOf()));
// or   .orElseGet(CompletableFuture::allOf));

}

实现它的方法之一是,简单地进行两个更改。

  1. Optional<Detail>作为参数传递给delete方法,并在执行实际逻辑之前在其中进行必要的检查。
  2. .thenCompose()更改为.thenAccept() 它将返回CompletionStage<Void> ,您可以在返回方法返回的顶部之前将其转换为CompletableFuture<Void>

private CompletableFuture<Void> processSomething(final SomeEvent event) {
    final CompletableFuture<PaginatedQueryList<Detail>> detail = dao.getData(event.getOrderId());
    return (CompletableFuture<Void>)detail.thenApply(n -> n.stream()
        .filter(i -> i.getBusinessType().equals(BusinessType.AWESOME))
        .findFirst()
        .filter(i -> i.getLastUpdateEventTimestamp() <= event.getCreationTime())) // This returns Optional<Detail>
        .thenAccept(i -> deleteItem(event, i).join())); // deleteItem is a async call that returns CompletableFuture<Void>
}

private CompletableFuture<Void> deleteItem(Optional<Detail> optionalDetail){
     if(optionalDetail.isPresent()){
       // Your existing logic
     }
}

假设如果您不想更改deleteItem()方法签名,那么只需将其作为,

.thenAccept(i -> 
     {
      if(i.isPresent()){
         deleteItem(event, i.get());
      }
     });

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM