我有一个关于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>)。这样,您就不需要类型转换。

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

最后,作为一般规则,您应该对多行lambda进行三思,并且绝对避免嵌套lambda。您应该考虑为这些lambda创建新方法。

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

10-12 03:55