java - 返回 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)
。
解决方案
在 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));
}
推荐阅读
- java - Tomcat v8.0 服务器启动失败
- typescript - Svelte:手风琴选择器的数据绑定
- woocommerce - wc_create_order 制作重复
- python - 防止 PyCharm-Debugger 在脚本运行后自动退出脚本
- python - 使用 zip_longest 对不同长度的列表求和,并从开始而不是结束填充不同的长度
- c++ - Boost system 1.69.0 不只是标题?
- java - java.lang.IllegalStateException:正在合并同一实体 [] 的多个表示。分离:[]; 分离:[]
- android - Xamarin.Forms。像 Telegram 一样滑动到上一页
- ios - 框架内具有持久性容器的 CoreData 堆栈
- angular - 如何对树表的子元素进行路由?