首页 > 解决方案 > 返回 CompletableFuture在条件函数中

问题描述

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)

标签: javaasynchronousjava-8completable-future

解决方案


在 for 的函数中返回一个已经完成的未来并没有错thenCompose。如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));

}

推荐阅读