This PR make the route declaration shorter and more readable, for example for Reactor website:

Instead of:

private static RouterFunction<?> routes() {
    return route(GET("/docs/api/**"), request ->
            status(FOUND).location(URI.create(request.path().replace("/docs/", "/old/"))).build())
        .andRoute(GET("/docs/reference/**"), request ->
            status(FOUND).location(URI.create(request.path().replace("/docs/", "/old/"))).build())
        .andRoute(GET("/docs/raw/**"), request ->
            status(FOUND).location(URI.create(request.path().replace("/docs/", "/old/"))).build())
        .andRoute(GET("/docs/{dir}/api"), request ->
            status(FOUND).location(URI.create(request.path().replace("api", "release"))).build())
        .andRoute(GET("/core/docs/reference/**"), request ->
            status(FOUND).location(URI.create("https://github.com/reactor/reactor-core/blob/master/README.md")).build())
        .andRoute(GET("/core/docs/api/**"), request ->
            status(FOUND).location(URI.create(request.path().replace("/core/docs/","/docs/core/release/"))).build())
        .andRoute(GET("/netty/docs/api/**"), request ->
            status(FOUND).location(URI.create(request.path().replace("/netty/docs/","/docs/netty/release/"))).build())
        .andRoute(GET("/ipc/docs/api/**"), request ->
            status(FOUND).location(URI.create(request.path().replace("/ipc/docs/", "/docs/ipc/release/"))).build())
        .andRoute(GET("/ext/docs/api/**/test/**"), request ->
            status(FOUND).location(URI.create(request.path().replace("/ext/docs/", "/docs/test/release/"))).build())
        .andRoute(GET("/ext/docs/api/**/adapter/**"), request ->
            status(FOUND).location(URI.create(request.path().replace("/ext/docs/", "/docs/adapter/release/"))).build())
        .and(resources("/**", new ClassPathResource("static/")))
        ;
}

We can write:

private static RouterFunction<?> routes() {
    return routeGet("/docs/api/**", request ->
            status(FOUND).location(URI.create(request.path().replace("/docs/", "/old/"))).build())
        .andRouteGet("/docs/reference/**", request ->
            status(FOUND).location(URI.create(request.path().replace("/docs/", "/old/"))).build())
        .andRouteGet("/docs/raw/**", request ->
            status(FOUND).location(URI.create(request.path().replace("/docs/", "/old/"))).build())
        .andRouteGet("/docs/{dir}/api", request ->
            status(FOUND).location(URI.create(request.path().replace("api", "release"))).build())
        .andRouteGet("/core/docs/reference/**", request ->
            status(FOUND).location(URI.create("https://github.com/reactor/reactor-core/blob/master/README.md")).build())
        .andRouteGet("/core/docs/api/**", request ->
            status(FOUND).location(URI.create(request.path().replace("/core/docs/","/docs/core/release/"))).build())
        .andRouteGet("/netty/docs/api/**", request ->
            status(FOUND).location(URI.create(request.path().replace("/netty/docs/","/docs/netty/release/"))).build())
        .andRouteGet("/ipc/docs/api/**", request ->
            status(FOUND).location(URI.create(request.path().replace("/ipc/docs/", "/docs/ipc/release/"))).build())
        .andRouteGet("/ext/docs/api/**/test/**", request ->
            status(FOUND).location(URI.create(request.path().replace("/ext/docs/", "/docs/test/release/"))).build())
        .andRouteGet("/ext/docs/api/**/adapter/**", request ->
            status(FOUND).location(URI.create(request.path().replace("/ext/docs/", "/docs/adapter/release/"))).build())
        .and(resources("/**", new ClassPathResource("static/")))
        ;
}

Also in Kotlin it provides for free a workaround for a limitation that forces to specify the lambda type, so instead of writing:

route(GET("/"), HandlerFunction { ok().body(fromObject("Hello Mix-IT!")) })
.andRoute(GET("/user/{id}"), HandlerFunction { req -> ok().body(fromObject(User(req.pathVariable("id").toLong(), "Robert"))) })

We can write:

routeGet("/", { ok().body(fromObject("Hello Mix-IT!")) })
.andRouteGet("/user/{id}", { req -> ok().body(fromObject(User(req.pathVariable("id").toLong(), "Robert"))) })

Comment From: sdeleuze

I deleted my fork branch for this outdated PR that is not relevant anymore.