Грамматика в Vertx HttpServerRequest - PullRequest
0 голосов
/ 01 мая 2020

Я довольно новичок в Java, и я недавно изучаю Vertx, я не могу понять, как работает следующий код:

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

Мой вопрос: почему параметр req do не нужно объявлять тип и откуда взято это требование?

1 Ответ

1 голос
/ 02 мая 2020

Давайте разберем его на части.

Создание 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" для каждого входящего request.

Теперь мы можем связать экземпляр MyReqesutHandler с нашим экземпляром httpServer.

httpServer.requestHandler(new MyRequestHandler())

и запустить сервер HTTP на порту 8080

httpServer.listen(8080);

Рефакторинг с использованием лямбда-выражений

Обратите внимание, что Handler - это так называемый функциональный интерфейс [2], вместо определения целого класса, мы можем передать лямбда-функцию [3] непосредственно в httpServer.requestHandler().

Мы можем избежать большого количества стандартного кода.

Таким образом, используя лямбду, нам не нужно определять целый класс, достаточно сделать:

httpServer.requestHandler(req -> req.response().end("Hello"));

Теперь, поскольку JAVA компилятор знает httpServer.requestHandler() принимает экземпляр Handler<HttpServerRequest>, может выводить тип req в типе компиляции, просто взглянув на объявление метода.

Рефакторинг с использованием Fluent API

Так как vert.x поддерживает Fluet API [4], мы можем связывать метод без использования промежуточных переменных. * 10 54 *

vertx.createHttpServer()
      .requestHandler(req -> req.response().end("hello"))
      .listen(8080);

Я настоятельно рекомендую вам взглянуть на Java лямбда-уроки и почувствовать их приятное чувство, поскольку они используются в основном не только в Vert.x, но и в Java мир повсюду.

Веселись!


[1] https://vertx.io/docs/apidocs/io/vertx/core/http/HttpServer.html#requestHandler -io.vertx.core.Handler-

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

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

[4] https://en.wikipedia.org/wiki/Fluent_interface

...