java - Vertx HttpServerRequest 中的语法
问题描述
我是 Java 新手,最近在学习 Vertx,我不明白以下代码是如何工作的:
@Override
public void start() {
vertx.createHttpServer()
.requestHandler(req -> req.response()
.end("hello"))
.listen(8080);
}
我的问题是:为什么参数req
不需要声明类型,这个 req 是从哪里来的?
解决方案
让我们把它分成几块。
创建 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
实例相关联。
httpServer.requestHandler(new MyRequestHandler())
并在端口上启动 HTTP 服务器8080
httpServer.listen(8080);
使用 lambda 重构
请注意,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 世界中无处不在。
玩得开心!
[2] https://www.baeldung.com/java-8-functional-interfaces
[3] https://www.geeksforgeeks.org/lambda-expressions-java-8/
推荐阅读
- python - 尝试使用 CV2 从 WebCam 捕获视频时出错
- ms-access - MS ACCESS - 如何在更改事件中获取未绑定组合框的当前列值
- python - 将 Tensorflow 1 代码升级到 TensorFlow 2 代码期间的警告
- html - 图片上1px的白边不会消失
- c - 将 char 数组传递给 const char * 时 strptime 引发分段错误
- html - 我的选择没有收到滚动 webkit(样式组件)
- dafny - Dafny 的详尽战术清单?
- c# - 如何在Unity C#中删除文件的内容
- excel - 将 countif 和转置到另一张工作表的运行时错误
- parsing - Arduino通过以太网解析UDP数据包,其中包含乱码