Spring gateway使用一个lambda例子的说明


spring gateway url 跳转的一段代码 参考官方demo地址

https://github.com/spring-cloud-samples/spring-cloud-gateway-sample/blob/master/src/main/java/com/example/demogateway/DemogatewayApplication.java

   

   @Bean
    public RouteLocator customRouteLocator(RouteLocatorBuilder builder) {
        //@formatter:off
        return builder.routes()
                .route("path_route", r -> r.path("/hello")
                        .uri("http://www.163.com/"))
                .route("path_route_1", r -> r.path("/get")
                        .uri("http://www.baidu.com/"))

                .build();
        //@formatter:on
    }

这段代码使用了lambda表达式

使用代码跟踪 route() 函数

		public Builder route(String id, Function<PredicateSpec, Route.Builder> fn) {
			Route.Builder routeBuilder = fn.apply(new RouteSpec(this).id(id));
			add(routeBuilder);
			return this;
		}
"path_route", r -> r.path("/hello")

                        .uri("http://www.163.com/") 这两个参数对应 

String id, Function<PredicateSpec, Route.Builder> fn 这两个参数

可以看到 :

r -> r.path("/hello")
                        .uri("http://www.163.com/")
这段代码 实现了 Function 接口的函数式接口
@FunctionalInterface
public interface Function<T, R> {

    /**
     * Applies this function to the given argument.
     *
     * @param t the function argument
     * @return the function result
     */
    R apply(T t);

r 就是function<T,R> 里面的T,对应Function<PredicateSpec, Route.Builder> fn 

就是 r = PredicateSpec , Route.Builder 对应R 是返回值

r.path("/hello")
                        .uri("http://www.163.com/")

的返回值就是Route.Builder,下面是uri的方法 记得他是有个Route.Builder的返回值的

	public Route.Builder uri(String uri) {
		return this.routeBuilder.uri(uri);
	}
如果没有 return this.routeBuilder.uri(uri);    

代码该改成 类似如下()

r ->    { Route.Builder res = r.path("/hello") .uri("http://www.163.com/")...

             return res ;

          }

 只是举个例子 只是说 要有返回值

以前看的一个带返回值的例子

filters.add(original -> {
			HttpHeaders filtered = new HttpHeaders();
			original.entrySet().stream()
					.filter(entry -> !entry.getKey().toLowerCase().startsWith("sec-websocket"))
					.forEach(header -> filtered.addAll(header.getKey(), header.getValue()));
			return filtered;
//记得出参和入参和接口里面方法保持一致即可
		});

 

猜你喜欢

转载自blog.csdn.net/albertfly/article/details/80568791