Returning CompletableFuture 在条件函数中返回

问题描述 投票:0回答:1

我有一个用例,其中我必须从根据条件组成2个可完成期货的函数中返回CompletableFuture<Void>

下面是我现在所拥有的-

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)

java asynchronous java-8 completable-future
1个回答
0
投票

实现此目标的方法之一是,只需进行两个更改。

  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());
      }
     });
© www.soinside.com 2019 - 2024. All rights reserved.