Java 返回void和返回CompletionStage之间有什么区别吗<;无效>;?
更具体地说,这两段代码有什么区别,一段返回Java 返回void和返回CompletionStage之间有什么区别吗<;无效>;?,java,asynchronous,completable-future,Java,Asynchronous,Completable Future,更具体地说,这两段代码有什么区别,一段返回void,另一段返回CompletionStage 使用void或CompletionStage中的一个与另一个相比有什么优势 在代码示例2中,我没有使用thencomose中的变量x。有更好的写作方法吗 如果我在函数doValidation中返回一个boolean,并在performTask函数中检查true是否更好 代码示例1: public CompletionStage<Response> performTask(Request
void
,另一段返回CompletionStage
- 使用
或void
中的一个与另一个相比有什么优势CompletionStage
- 在代码示例2中,我没有使用
thencomose
中的变量x
。有更好的写作方法吗 - 如果我在函数
中返回一个doValidation
,并在boolean
函数中检查performTask
是否更好true
public CompletionStage<Response> performTask(Request request) throws MyException {
doValidation(request);
return service.performTask(request).thenCompose(serviceResponse -> CompletableFuture.completedFuture(buildMyResponse(serviceResponse)));
}
private void doValidation(Request request) throws MyException {
CompletableFuture.runAsync(() -> {
// Validate
if (*someCondition*) {
throw new MyException(.....);
}
});
}
public CompletionStage<Response> performTask(Request request) throws MyException {
return doValidation(request).thenCompose(x -> {
return service.performTask(request).thenCompose(serviceResponse -> CompletableFuture.completedFuture(buildMyResponse(serviceResponse)));
});
}
private CompletionStage<Void> doValidation(Request request) throws MyException {
return CompletableFuture.runAsync(() -> {
// Validate
if (*someCondition*) {
throw new MyException(.....);
}
});
}
public CompletionStage性能任务(请求)抛出MyException{
验证(请求);
返回service.performTask(请求),然后组合(serviceResponse->CompletableFuture.completedFuture(buildMyResponse(serviceResponse));
}
私有void doValidation(请求)抛出MyException{
CompletableFuture.runAsync(()->{
//证实
if(*someCondition*){
抛出新的MyException(…);
}
});
}
代码示例2:
public CompletionStage<Response> performTask(Request request) throws MyException {
doValidation(request);
return service.performTask(request).thenCompose(serviceResponse -> CompletableFuture.completedFuture(buildMyResponse(serviceResponse)));
}
private void doValidation(Request request) throws MyException {
CompletableFuture.runAsync(() -> {
// Validate
if (*someCondition*) {
throw new MyException(.....);
}
});
}
public CompletionStage<Response> performTask(Request request) throws MyException {
return doValidation(request).thenCompose(x -> {
return service.performTask(request).thenCompose(serviceResponse -> CompletableFuture.completedFuture(buildMyResponse(serviceResponse)));
});
}
private CompletionStage<Void> doValidation(Request request) throws MyException {
return CompletableFuture.runAsync(() -> {
// Validate
if (*someCondition*) {
throw new MyException(.....);
}
});
}
public CompletionStage性能任务(请求)抛出MyException{
返回doValidation(请求)。然后组合(x->{
返回service.performTask(请求),然后组合(serviceResponse->CompletableFuture.completedFuture(buildMyResponse(serviceResponse));
});
}
私有CompletionStage doValidation(请求)抛出MyException{
返回CompletableFuture.runAsync(()->{
//证实
if(*someCondition*){
抛出新的MyException(…);
}
});
}
我正在回答你的第一个问题
What advantages of using one of void or CompletionStage<Void> over the other?
然而,当您运行tryWithCompletionStageVoid()
时,它将是:
Started
Exit
Validation failed! value is null
Started
Validation failed! value is null
Validation complete
Exit
在第一种方法中,tryWithVoid()
,它没有等待操作完成。因此,操作的结果可能对调用后的代码可用,也可能不可用
但是,在第二种方法tryWithCompletionStageVoid()
中,它会在运行下一个阶段之前等待该阶段完成
如果阶段之间没有依赖关系,可以使用
void
我正在回答您的第一个问题
What advantages of using one of void or CompletionStage<Void> over the other?
然而,当您运行tryWithCompletionStageVoid()
时,它将是:
Started
Exit
Validation failed! value is null
Started
Validation failed! value is null
Validation complete
Exit
在第一种方法中,tryWithVoid()
,它没有等待操作完成。因此,操作的结果可能对调用后的代码可用,也可能不可用
但是,在第二种方法tryWithCompletionStageVoid()
中,它会在运行下一个阶段之前等待该阶段完成
如果两个阶段之间没有依赖关系,可以使用
void不同之处在于,返回void
后,您无法执行任何链接到CompletableFuture
的操作
当您返回CompletableFuture
时,您可以将更多内容链接到它。例如,调用thenRun()
,thenRunAsync()
,或者只调用join()
,在需要时等待它完成
因此,这取决于调用方是否关心CompletableFuture
的状态,是否希望应用附加到它的进一步逻辑
在您的例子中,在示例1中,doValidation()
在一个单独的线程上运行,对它发生的任何事情都与此无关service.performTask()
将独立于它进行,甚至可以在doValidation()
之前启动和/或完成
在示例2中,doValidation()
必须在实际执行performTask()
之前成功完成。看来这个版本实际上是正确的。请记住,运行CompletionStage performTask()
的主线程将在设置管道后立即完成并返回,实际的performValidation()可能仍在运行(甚至可能尚未启动)
顺便说一下,您可以将调用简化如下:
service.performTask(request).thenApply(this::buildMyResponse);
您不必再次将其包装在可完成的未来中,只需使用然后使用compose()
再次将其展开即可。不同之处在于,如果返回void
,则无法在完成后执行任何链接到可完成的未来的操作
当您返回CompletableFuture
时,您可以将更多内容链接到它。例如,调用thenRun()
,thenRunAsync()
,或者只调用join()
,在需要时等待它完成
因此,这取决于调用方是否关心CompletableFuture
的状态,是否希望应用附加到它的进一步逻辑
在您的例子中,在示例1中,doValidation()
在一个单独的线程上运行,对它发生的任何事情都与此无关service.performTask()
将独立于它进行,甚至可以在doValidation()
之前启动和/或完成
在示例2中,doValidation()
必须在实际执行performTask()
之前成功完成。看来这个版本实际上是正确的。请记住,运行CompletionStage performTask()
的主线程将在设置管道后立即完成并返回,实际的performValidation()可能仍在运行(甚至可能尚未启动)
顺便说一下,您可以将调用简化如下:
service.performTask(request).thenApply(this::buildMyResponse);
您不必再次将其包装在CompletableFuture
中,只需使用thencomose()
再次将其展开即可。我相信示例一中的验证是一种异步操作,在服务中执行任务时,验证可能会发生,也可能不会发生。然而,在示例2中,任务在阶段完成后执行