首页 > 解决方案 > 如何使用completionStage编写while循环,最终返回CompletionStage而不加入?

问题描述

我必须编写一个返回的函数CompletionStage<Void>。该函数可以查询分页数据(异步操作,返回包裹在中的数据CompletionStage)并处理它们并查询下一组数据,直到它处理完整个数据集。有没有一种方法可以在不使用连接的情况下在完成阶段使用 while 循环?

public CompletionStage<Void> process(Input){
    while(allDataProcessed){
       queryDataAndProcess(This itself is async function)
    }
}

标签: java-8completable-futurecompletion-stage

解决方案


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 模式


推荐阅读