Vertx HttpServerRequest 中的语法

The grammar in Vertx HttpServerRequest

我是Java新手,最近在学习Vertx,看不懂下面的代码是怎么工作的:

@Override
public void start() {
    vertx.createHttpServer()
        .requestHandler(req -> req.response()
          .end("hello"))
        .listen(8080);
}

我的问题是:为什么参数req不需要声明类型,这个req从哪里来?

让我们把它分解成碎片。

创建 HTTP 服务器

正在使用我们的 Vertx 实例创建实例 HttpSever

HttpServer httpServer = vertx.createHttpServer();

定义请求处理程序

现在,对于我们的 HttpServer,我们可以定义传入请求的处理程序。

我们可以为此使用 HttpServer#requestHandler(Handler<HttpServerRequest> handler) [1]。此方法采用 Handler<HttpRequest>.

的实例

所以,我们可以定义 Handler<HttpServerRequest> 的实例如下:

private static class MyRequestHandler implements Handler<HttpServerRequest> {

    @Override
    public void handle(HttpServerRequest req) {
        req.response().end("Hello");
    }
}

此处理程序将为每个传入请求打印 "Hello"

现在我们可以将 MyReqesutHandler 的实例与我们的 httpServer 实例相关联。

httpServer.requestHandler(new MyRequestHandler())

并在端口 8080

上启动 HTTP 服务器
httpServer.listen(8080);

使用 lambda 进行重构

请注意,Handler 是一个所谓的功能接口 [2] 而不是定义整个 class 我们可以将 lambda 函数 [3] 直接传递给 httpServer.requestHandler().

我们可以避免大量样板代码。

所以通过使用 lambda,我们不需要定义整个 class,这就足够了:

httpServer.requestHandler(req -> req.response().end("Hello"));

现在因为 JAVA 编译器知道 httpServer.requestHandler() 采用 Handler<HttpServerRequest> 的实例,它可以 推断 类型的 req在编译类型中,只需查看方法声明即可。

使用 Fluent 重构 API

由于vert.x提升了Fluet API [4],我们可以链接方法而不需要中间变量。

vertx.createHttpServer()
      .requestHandler(req -> req.response().end("hello"))
      .listen(8080);

我强烈建议您查看 Java lambda 教程 并且对它们有很好的感觉,因为它们几乎不在 Vert.x 中使用但在 Java 世界各地。

玩得开心!


[1] https://vertx.io/docs/apidocs/io/vertx/core/http/HttpServer.html#requestHandler-io.vertx.core.Handler-

[2]https://www.baeldung.com/java-8-functional-interfaces

[3]https://www.geeksforgeeks.org/lambda-expressions-java-8/

[4]https://en.wikipedia.org/wiki/Fluent_interface