在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));
}
,
实现它的一种方法就是简单地进行两个更改。
- 将
mysqli_query
作为参数传递给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()
本文链接:https://www.f2er.com/2959975.html