我的方法如何返回lambda表达式中计算的值?

时间:2017-08-02 18:37:14

标签: java lambda vert.x

这是我的代码的简化版本:

public void pairing() {
    WebClient web = WebClient.create(vertx);
    String url = "/request";
    JsonObject obj = new JsonObject();
    web
        .post(6660, "localhost", url)
        .sendJsonObject(obj, response -> {
            JsonObject pairing = response.result().body().toJsonObject(); // what I want to return
        }
}

这会向localhost:6660 / request发出POST请求,并创建一个名为pairing的新JsonObject,用于存储对该请求的响应。我可以处理请求的lambda表达式内部的配对,但理想情况下,我可以将JsonObject返回到调用pairing()并从那里处理它的方法。

我试过了:

public JsonObject pairing() {
    JsonObject pairing = new JsonObject();
    WebClient web = WebClient.create(vertx);
    String url = "/request";
    JsonObject obj = new JsonObject();
    web
        .post(6660, "localhost", url)
        .sendJsonObject(obj, response -> {
            pairing = response.result().body().toJsonObject();
        }
    return pairing;
}

但它不起作用,因为我得到了#34;配对必须是最终的或有效的最后一次"错误。有什么方法可以回归"配对"从这个方法,以便我可以在我的程序中的其他地方访问它?或者我可能以错误的方式接近这个?

1 个答案:

答案 0 :(得分:6)

使用期货:

public Future<JsonObject> pairing() {
        Future<JsonObject> future = Future.future();
    WebClient web = WebClient.create(vertx);
    String url = "/request";
    JsonObject obj = new JsonObject();
    web
        .post(6660, "localhost", url)
        .sendJsonObject(obj, response -> {
            future.complete(response.result().body().toJsonObject());
        }
    return future;
}

现在调用此函数:

pairing().setHandler(r -> {
    r.result // This is your JSON object
});

WebClient将异步执行。您正在尝试的是同步,这是使用WebClient无法实现的,同步调用也将是vert.x中的阻塞调用。这也是黄金法则,不要阻止事件循环。