java-8 - 如何使用completionStage编写while循环,最终返回CompletionStage而不加入?
问题描述
我必须编写一个返回的函数CompletionStage<Void>
。该函数可以查询分页数据(异步操作,返回包裹在中的数据CompletionStage
)并处理它们并查询下一组数据,直到它处理完整个数据集。有没有一种方法可以在不使用连接的情况下在完成阶段使用 while 循环?
public CompletionStage<Void> process(Input){
while(allDataProcessed){
queryDataAndProcess(This itself is async function)
}
}
解决方案
public CompletionStage<Void> process(Input) {
CompletableStage<Void> loop = CompletableFuture.completedFuture(null);
while(allDataProcessed) {
loop = loop.thenCompose( unusued -> queryDataAndProcess(...) );
}
return loop;
}
此解决方案的缺点是它可能会在内存中创建许多对象。为避免此问题,您可以使用IBM async utils:
public CompletionStage<Void> process(Input) {
return AsyncTrampoline.asyncWhile( () ->
queryDataAndProcess(...).thenApply( r -> allDataProcessed )
)
}
使用 Maven,您可以将其添加到您的项目中:
<dependency>
<groupId>com.ibm.async</groupId>
<artifactId>asyncutil</artifactId>
<version>0.1.0</version>
</dependency>
这个库实现了Trampoline 模式
推荐阅读
- javascript - 类型错误:carouselImages[0] 未定义
- gitlab - 如何在 .gitlab-ci.yml 中重用工作
- javascript - setState() 和 Object.keys() 通过父组件中的获取请求
- python - TypeError:列表索引必须是整数或切片,而不是列表 - 我该怎么办?
- javascript - 在 NodeJS 应用程序中发出 HTTP 请求时,何时显式设置标头
- php - 我想在获取访问令牌后通过将 API 与 curl php 集成来获取用户详细信息
- angular - Bootstrap 模态在后台打开(Angular)
- mongodb - 我正在尝试将我的节点休息 api 数据存储到 mongodb 地图集。但是遇到插入错误
- splunk - 我们如何编写 Splunk 查询来查找 subField2 是否存在,如果存在则获取所有 subFiled2 的计数
- python - 尝试从while not循环转换为while循环时,while循环没有中断