sto*_*one 5 java akka completable-future
我对Java中的CompletableFuture有疑问.我正在等待CompletableFuture完成,并且根据收到的结果,我想要调用一个新任务并等待CompletableFuture完成或做一些不同的事情.我对我的解决方案不满意,因为有很多回调,并且阅读不同.你能帮助我改进我的代码吗?
final CompletableFuture<String> future = new CompletableFuture<>();
final ActorRef processCheckActor = actorSystem.actorOf(
springExtension.props("ProcessCheckActor"), "processCheckActor-" + new Random().nextInt());
final CompletableFuture<Object> checkResponse =
PatternsCS.ask(processCheckActor, new ProcessToCheckMessage(processId), TIMEOUT)
.toCompletableFuture();
checkResponse.thenAccept(obj -> {
final ProcessCheckResponseMessage msg = (ProcessCheckResponseMessage) obj;
if (msg.isCorrect()) {
final CompletableFuture<Object> response =
PatternsCS.ask(processSupervisorActor, new ProcessStartMessage(processId), TIMEOUT)
.toCompletableFuture();
response.thenAccept(obj2 -> {
future.complete("yes");
});
} else {
future.complete("no");
}
});
Run Code Online (Sandbox Code Playgroud)
首先,您应该避免创建CompletableFuture<Object>. 泛型类型应该是函数返回的类型(CompletableFuture<ProcessCheckResponseMessage>在您的情况下)。这样你就不需要演员了。
我建议使用thenApply而不是thenAccept. 这将为您创建第二个 CompletableFuture,这意味着您不再需要第一行中的声明。
最后,作为一般规则,您应该三思而后行地考虑多行 lambda 表达式,并且绝对避免嵌套 lambda 表达式。您应该考虑为这些 lambda 创建一个新方法。
| 归档时间: |
|
| 查看次数: |
906 次 |
| 最近记录: |