gpt4 book ai didi

java - 引用 CompletableFuture 中的字段,它又可以是 CompletableFuture : java

转载 作者:搜寻专家 更新时间:2023-11-01 02:06:14 31 4
gpt4 key购买 nike

我正在调用一个返回 CompletableFuture 的服务。

输出结构如下。

Class Output {
public String name;
public Integer age;
}

我想调用服务,并想继续执行直到名字出现。

有点像,

CompletableFuture<Output> futureOutput = makeServiceCall(input);
String name = futureOutput.get().name;
processName(name); // which will do some costly operations and make use of the name at the end.

在上述方法中,我需要等到我的 futureOutput准备好了,即使我以后才需要它。

我正在寻找类似于以下方法的方法。

CompletableFuture<Output> futureOutput = makeServiceCall(input);
CompletableFuture<String> futureName = futureOutput.get().name; // This is wrong, but can we create a reference in a similar way?
processName(futureName); // which will do some costly operations and make use of the name at the end.

我改一下processName的签名就好了来自 StringCompletableFuture<String>但不是 CompletableFuture<Output>作为Output该方法没有任何意义。

有什么建议的方法可以让 future 的引用成为另一个 future 的领域。

最佳答案

只需使用CompletableFuture.thenApplyAsync

来自 JavaDoc:

Returns a new CompletionStage that, when this stage completes normally, is executed using this stage's default asynchronous execution facility, with this stage's result as the argument to the supplied function.

在您的示例中(其中 TprocessName 方法的返回类型):

CompletableFuture<Output> future = makeServiceCall(input);
CompletableFuture<T> result = future.thenApplyAsync(o -> processName(o.name));

现在,当 makeServiceCall CompletableFuture 完成时,会生成另一个 CompletableFuture 来包装对 processName 的异步调用- 这会创建一个异步管道。

根据你想做什么,你可能会使用什么CompletableFuture.thenAcceptAsync相反,例如,如果 processName 没有返回有用的结果:

CompletableFuture<Output> future = makeServiceCall(input);
CompletableFuture<Void> result = future.thenAcceptAsync(o -> processName(o.name));

如果此处理未完成,您可能还需要错误处理,这可以通过 CompletableFuture.exceptionally 完成.这会添加一个回调,如果处理管道以 Exception 终止,则会调用此回调。

通过一个完整的例子,你可以这样做:

makeServiceCall(input)
.thenApplyAsync(Output::getName)
.thenAcceptAsync(this::processName)
.exceptionally(e -> {
//log the error
System.out.printf("Oops - %s%n", e);
//return some useful default value
return ProcessingResult.SUCCESSFUL;
});

这个管道(虽然有点做作 - 不需要获得名称 async)是完全异步的。任何时候都不需要阻塞创建任务的Thread;任务要么成功完成,要么调用失败处理程序。

关于java - 引用 CompletableFuture 中的字段,它又可以是 CompletableFuture : java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32350739/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com