java - 如何使用方法内部的 Java 匿名函数中获取的数据

标签 java methods scope anonymous-function vert.x

似乎是一个常见问题,但我只是不确定解决方案。

我正在使用 Vert.x 和 Java 来调用另一个服务。我正在使用 Vert.x 的 WebClient 库。当我发出 POST 请求时,参数之一是匿名函数。如果请求成功,我就会得到我的数据。

问题是在我的方法的其余部分中在匿名函数之外获取这些数据。我希望我的方法返回从匿名函数获得的数据。数据位于 body 变量中。

private JsonArray itemTypes() {
  WebClient webClient = WebClient.create(vertx);
  webCLient.post(80, "myApi.com", "/api/items")
    .sendJsonObject(new JsonObject().put("mutator", "*"), ar -> {
      if (ar.succeeded) {
        HttpResponse<JsonArray> result = ar.result();
        JsonArray body = result.body();
      } else {
        System.out.println(ar.cause().getMessage());
      }
    });
}

现在,如果我尝试在匿名函数外部声明 body 变量并在内部分配它(以便我可以返回该值),我的 IDE 会报错 Local variable body Defined在封闭范围内必须是最终的或有效最终的

我本质上想做这样的事情:

private JsonArray itemTypes() {
  JsonArray body;
  WebClient webClient = WebClient.create(vertx);
  webCLient.post(80, "myApi.com", "/api/items")
    .sendJsonObject(new JsonObject().put("mutator", "*"), ar -> {
      if (ar.succeeded) {
        HttpResponse<JsonArray> result = ar.result();
        body = result.body();
      } else {
        System.out.println(ar.cause().getMessage());
        body = new JsonArray();
      }
    });
  return body;
}

我尝试将 JsonArray 主体变量设置为最终变量,但这不起作用。我还尝试将整个 webClient.post(....) 调用分配给一个变量,但这也不起作用。

如何访问匿名函数外部的 body 数据,以便在我的方法中返回它?

最佳答案

您遇到的问题是 WebClient 似乎是完全异步的。这意味着当您调用 .sendJsonObject ,它基本上发送请求并立即返回;当 WebClient 等待答案时,您的代码将继续运行。

收到响应后,它会调用您提供的回调 lambda(可能在其他线程中)。这可能会在几秒钟后发生,并且您的许多其他代码可能有时间同时运行。

您需要的是让主代码等待收到响应。这可以通过多种方式完成,其中之一是创建 CompletableFuture<T> ,让回调调用 .complete(theValue)方法,然后让外部代码调用 .get()等待并接收值。

换句话说,外部代码将定义并等待 CompletableFuture<T>完成,然后有 .sendJsonObject回调为您完成所需的值。

关于java - 如何使用方法内部的 Java 匿名函数中获取的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51634502/

相关文章:

java - 如何使用 Java iText 检查所有使用的字体是否嵌入到 PDF 中?

javascript - 有人可以解释 this.value 在这个代码示例中的含义吗?

postgresql - 如何从 PostgreSQL 中的函数访问外部作用域变量?

javascript - 范围问题 - 退出循环

java - 使用 Stax 通过 DTD 解析 XML 时出错

java - 带有onclicklistener的android中的警报对话框

java - `Rectangle2D.Double` 如何知道它应该在对 `JOptionPane` 的调用中显示在 `paintIcon()` 内?

java - 在文本文件中查找字符串的方法,如果找不到字符串,则将字符串添加到文本文件,否则拒绝输入

python - 如何从一个方法中调用另一个方法?

javascript - 访问函数内部定义的全局变量