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 世界各地。
玩得开心!
[2]https://www.baeldung.com/java-8-functional-interfaces
我是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
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 世界各地。
玩得开心!
[2]https://www.baeldung.com/java-8-functional-interfaces