Java CompletableFuture : Avoid callback hell

标签 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");
  }
});

最佳答案

首先,你应该避免创建 CompletableFuture<Object> .通用类型应该是您的函数返回的类型(在您的情况下为 CompletableFuture<ProcessCheckResponseMessage>)。这样你就不需要 Actor 了。

我建议使用 thenApply而不是 thenAccept .这将为您创建第二个 CompletableFuture,这意味着您不再需要第一行中的声明。

最后,一般来说,对于多行 lambda,您应该三思而后行,绝对要避免嵌套的 lambda。您应该考虑为这些 lambda 表达式创建一个新方法。

关于Java CompletableFuture : Avoid callback hell,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40692698/

相关文章:

java - 将面板内容与面板顶部对齐

linux - 错误 : Could not find or load main class

scala - 安装akka(scala和ubuntu)的困难

scala - Akka Streams 与 Akka HTTP 服务器和客户端

java - 使用 Java 8 流和 CompletableFuture 的并行数据库调用

java - 为什么我的 CompletableFuture 代码在 Java 8 中运行而不在 Java 11 中运行?

java - WorkStealingPool 和 ThreadPoolExecutor 在与 CompletableFuture 一起使用时会产生不同的结果

java - 无法获取填写 PDFBox 的路径

java - 如何处理GWT/GXT中的客户端异常?

java - Akka HelloWorld 未编译 :-(