在条件函数中返回 CompletableFuture<Void>
Returning CompletableFuture<Void> in a conditional function
我有一个用例,我必须从一个函数中 return CompletableFuture<Void>
,该函数根据条件组成 2 个可完成的期货。
以下是我现在拥有的 -
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>
}
社区可以检查并建议任何其他方法吗?
我特别不喜欢 returning 显式 CompletableFuture.completedFuture(null)
.
实现它的方法之一是,只需进行两处更改。
- 将
Optional<Detail>
作为参数传递给 delete
方法并使
在执行实际逻辑之前对其内部进行必要的检查。
- 将
.thenCompose()
更改为 .thenAccept()
。它将 return
CompletionStage<Void>
您可以转换为 CompletableFuture<Void>
在方法 return 顶部 return 之前 return.
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());
}
});
在 thenCompose
的函数中返回一个已经完成的 future 没有错。正如 中提到的,您也可以使用 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));
}
我有一个用例,我必须从一个函数中 return CompletableFuture<Void>
,该函数根据条件组成 2 个可完成的期货。
以下是我现在拥有的 -
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>
}
社区可以检查并建议任何其他方法吗?
我特别不喜欢 returning 显式 CompletableFuture.completedFuture(null)
.
实现它的方法之一是,只需进行两处更改。
- 将
Optional<Detail>
作为参数传递给delete
方法并使 在执行实际逻辑之前对其内部进行必要的检查。 - 将
.thenCompose()
更改为.thenAccept()
。它将 returnCompletionStage<Void>
您可以转换为CompletableFuture<Void>
在方法 return 顶部 return 之前 return.
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());
}
});
在 thenCompose
的函数中返回一个已经完成的 future 没有错。正如 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));
}