我有一个用例,其中我必须从根据条件组成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)
。
实现此目标的方法之一是,只需进行两个更改。
Optional<Detail>
作为参数传递给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()
方法签名,只需这样做,
.thenAccept(i ->
{
if(i.isPresent()){
deleteItem(event, i.get());
}
});