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

我有一个用例,我必须从根据条件组成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)

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

thenCompose的函数中返回已经完成的future没错。如this answer中所述,您也可以使用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. mysqli_query作为参数传递给Optional<Detail>方法,并进行 在执行实际逻辑之前,对它进行必要的检查。
  2. delete更改为.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()
本文链接:https://www.f2er.com/2959975.html

大家都在问