LambdaCriteria
LambdaCriteria
不知道各位读者有没有使用过mybatis-plus,如果使用过的话,那么条件构造器一定也比较熟悉。
那么先让我们来熟悉下所需要的一些基本知识。
Function<T, R>
JAVA8新增函数式接口
1 |
|
@FunctionalInterface
- 该注解只能标记在”有且仅有一个抽象方法”的接口上。
- JDK8接口中的静态方法和默认方法,都不算是抽象方法。
- 接口默认继承java.lang.Object,所以如果接口显示声明覆盖了Object中方法,那么也不算抽象方法。
- 该注解不是必须的,如果一个接口符合”函数式接口”定义,那么加不加该注解都没有影响。加上该注解能够更好地让编译器进行检查。如果编写的不是函数式接口,但是加上了@FunctionInterface,那么编译器会报错。
自定义SFunction<T, R>
接口
参考mybatis-plus的Lambda条件构造器自定义
SFunction<T, R>
继承Function<T, R>
, 和Serializable
;使我们自定义的SFunction<T, R>
函数式接口是支持序列化的。
1 |
|
那么函数式接口序列化之后能够获得什么呢?请继续往下看
SerializedLambda
SerializedLambda
是jdk1.8提供的一个新的类,凡是继承了Serializable的函数式接口的实例都可以获取一个属于它的SerializedLambda实例,并且通过它获取到方法的名称,根据我们标准的java bean的定义规则就可以通过方法名称来获取属性名称
1 |
|
变量和类型 | 方法 | 描述 |
---|---|---|
Object |
getCapturedArg(int i) |
获取lambda捕获站点的动态参数。 |
int |
getCapturedArgCount() |
获取lambda捕获站点的动态参数计数。 |
String |
getCapturingClass() |
获取捕获此lambda的类的名称。 |
String |
getFunctionalInterfaceClass() |
获取此lambda已转换为的调用类型的名称 |
String |
getFunctionalInterfaceMethodName() |
获取已转换此lambda的功能接口的主要方法的名称。 |
String |
getFunctionalInterfaceMethodSignature() |
获取此lambda已转换为的功能接口的主要方法的签名。 |
String |
getImplClass() |
获取包含实现方法的类的名称。 |
int |
getImplMethodKind() |
获取方法句柄类(参见MethodHandleInfo )的实现方法。 |
String |
getImplMethodName() |
获取实现方法的名称。 |
String |
getImplMethodSignature() |
获取实现方法的签名。 |
String |
getInstantiatedMethodType() |
在将类型变量替换为来自捕获站点的实例化之后,获取主要功能接口方法的签名。 |
这里我们主要使用的就是getImplClass()
和getImplMethodName()
1 |
|
此时我们就能获取到字段名了
1 |
|
好了,接下来我们就可以参照mybatis-plus
的条件构造器,来实现我们自己的mongoDB
或者ES
的条件构造器了。
LambdaCriteria
https://happyloves.cn/20220831/ebcfd7f5bf6b.html