我是 Java 新手,最近在学习 Vertx,我不明白以下代码是如何工作的:
@Override
public void start() {
vertx.createHttpServer()
.requestHandler(req -> req.response()
.end("hello"))
.listen(8080);
}
我的问题是:为什么参数req
不需要声明类型,这个 req 是从哪里来的?
我是 Java 新手,最近在学习 Vertx,我不明白以下代码是如何工作的:
@Override
public void start() {
vertx.createHttpServer()
.requestHandler(req -> req.response()
.end("hello"))
.listen(8080);
}
我的问题是:为什么参数req
不需要声明类型,这个 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
实例相关联。
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 世界中无处不在。
玩得开心!
[2] https://www.baeldung.com/java-8-functional-interfaces
[3] https://www.geeksforgeeks.org/lambda-expressions-java-8/