Vertx HttpServerRequest中的语法

问题描述 投票:1回答:1

我对Java比较陌生,最近在学习Vertx,我不明白下面的代码是怎么工作的。

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

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

java vert.x vertx-httpclient
1个回答
1
投票

让我们把它分成几块。

创建HTTP服务器

创建实例 HttpSever 使用我们 Vertx 实例。

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 实例,并在端口上启动HTTP服务器。

httpServer.requestHandler(new MyRequestHandler())

并在端口上启动HTTP服务器 8080

httpServer.listen(8080);

使用lambdas进行重构

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

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

所以,使用lambda,我们不需要定义整个类,就可以了。

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.iodocsapidocsiovertxcorehttpHttpServer.html#requestHandler-io.vertx.core.Handler-。

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

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

[4] https:/en.wikipedia.orgwikiFluent_interface。

© www.soinside.com 2019 - 2024. All rights reserved.