我们在配置路径时 经常加上统一的后台路径 比如
@Override
public void configurePathMatch(PathMatchConfigurer configurer) {
configurer.addPathPrefix("api", c->true);
}
此时对这个c->true可能看不懂,这其实是一个lambda表达式
尝试完全不用匿名内部类和lambda表达式来进行解释
@Override
public void configurePathMatch(PathMatchConfigurer configurer) {
class MyPredicate implements Predicate<Class<?>>{
@Override
public boolean test(Class<?> o) {
return true;
}
}
MyPredicate p = new MyPredicate();
configurer.addPathPrefix("api",p );
}
这里创建了一个内部类来继承Predicate接口,并且实现了里面的test方法
就是说 这个addPathPrefix的第二个参数 是一个实现了Predicate接口的对象。
当然 我们应该使用匿名内部类,比如
Predicate<Class<?>> p = new Predicate<Class<?>>() {
@Override
public boolean test(Class<?> aClass) {
return true;
}
};
configurer.addPathPrefix("api", p);
进一步地
configurer.addPathPrefix("api", new Predicate<Class<?>>() {
@Override
public boolean test(Class<?> aClass) {
return true;
}
});
转化成lambda表达式:
configurer.addPathPrefix("api", (Class<?> c) -> {
return true;
});
注意 这里的c是Predicate中的test(T t)方法中的参数
由于lambda可以根据上下文自动推断类型 所以可以省略类型 就变成了
configurer.addPathPrefix("api", (c) -> {
return true;
});
是不是已经很接近
configurer.addPathPrefix("api", c->true);
了呢?
由于在lambda表达式中 只有一个参数的时候 可以省略掉外面的括号 所以可以变成
configurer.addPathPrefix("api", c-> {
return true;
});
当只有一个语句的时候 我们可以省略中括号和ruturn语句
所以最后就变成了
configurer.addPathPrefix("api", c-> true);
当然 这里的c是任意的,自己取的变量名 比如说add(int a,int b)
这样 你可以随便取名字
这里取c是因为他是一个Class<?>类型的参数
也是可以的。