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

时间:2019-12-06 21:24:05

标签: java asynchronous java-8 completable-future

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

2 个答案:

答案 0 :(得分:2)

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 :(得分:0)

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

  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()