Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/387.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 返回void和返回CompletionStage之间有什么区别吗<;无效>;?_Java_Asynchronous_Completable Future - Fatal编程技术网

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
    是否更好
代码示例1:

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中,任务在阶段完成后执行