我对Java比较陌生,最近在学习Vertx,我不明白下面的代码是怎么工作的。
@Override
public void start() {
vertx.createHttpServer()
.requestHandler(req -> req.response()
.end("hello"))
.listen(8080);
}
我的问题是: 为什么参数 req
不需要声明一个类型,这个要求从何而来?
让我们把它分成几块。
创建实例 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);
请注意,Handler是一个所谓的函数接口[2],我们可以直接将一个lambda函数[3]传递给 httpServer.requestHandler()
.
我们可以避免大量的模板代码。
所以,使用lambda,我们不需要定义整个类,就可以了。
httpServer.requestHandler(req -> req.response().end("Hello"));
因为JAVA编译器知道 httpServer.requestHandler()
以一个 Handler<HttpServerRequest>
它可以 推断 类型 req
在编译类型中,只需查看方法声明即可。
由于 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