当前位置:网站首页>通过方法引用获取方法名
通过方法引用获取方法名
2022-08-02 10:36:00 【夜光下丶】
在学习Mybatis-plus时,可以通过getter方法的方法引用来获取到对应的字段名
LambdaQueryWrapper<PurchaseOrder> wrapper = new LambdaQueryWrapper<>();
wrapper.like(PurchaseOrder::getBillTypeName, order.getBillTypeName());这种情况避免了魔法值的出现,也不需要手动写死,避免因需求改变而导致的错误
QueryWrapper<OrderDataDTO> wrapper = new QueryWrapper<>();
wrapper.like("bill_type_name", dto.getBillTypeName())lambda表达式不仅可以通过方法引用简化代码,也可以通过getter/setter的方法引用获取到对应的属性名,避免出现bug
代码实现
函数式接口
首先需要定义一个函数式接口来接受我们的方法引用,该接口必须要继承 Serializable 才能获取到方法信息
@FunctionalInterface
public interface SFunction<T> extends Serializable {
/**
* 获取对象属性信息
*
* @param source
* @return
*/
Object get(T source);
}函数式接口:如果一个接口中只有一个抽象方法(可以包含多个默认方法或多个static方法),那么该接口就是函数式接口。本质上是将函数的实现直接转换为了一个声明语句的定义,极大简化了原有的实现方式
@FunctionalInterface:用来指定某个接口必须是函数式接口,所以该注解只能修饰接口,加上标注, 则会触发JavaCompiler的检查。对于符合函数接口的接口,加不加都无关紧要,但是加上则会提供一层编译检查的保障。如果不符合,则会报错。
工具类
解析Function获取字段属性名
public class ConvertUtil {
public static final String GET = "get";
public static final String IS = "is";
private static final Map<Class<?>, SerializedLambda> CLASS_LAMBDA_CACHE = new ConcurrentHashMap<>();
/**
* 转换方法引用为属性名
*
* @param fn
* @param <T>
* @return
*/
public static <T> String convertToFieldName(SFunction<T> fn) {
SerializedLambda lambda = getSerializedLambda(fn);
String methodName = lambda.getImplMethodName();
if (methodName.startsWith(GET)) {
methodName = methodName.substring(3);
} else if (methodName.startsWith(IS)) {
methodName = methodName.substring(2);
} else {
throw new IllegalArgumentException("无效的getter方法:" + methodName);
}
return StringUtil.firstToLowerCase(methodName);
}
public static SerializedLambda getSerializedLambda(Serializable fn) {
SerializedLambda lambda = CLASS_LAMBDA_CACHE.get(fn.getClass());
// 先检查缓存中是否存在
if (lambda == null) {
try {
// 提取SerializedLambda并缓存
Method method = fn.getClass().getDeclaredMethod("writeReplace");
method.setAccessible(Boolean.TRUE);
lambda = (SerializedLambda) method.invoke(fn);
CLASS_LAMBDA_CACHE.put(fn.getClass(), lambda);
} catch (NoSuchMethodException | InvocationTargetException | IllegalAccessException e) {
throw new RuntimeException(e);
}
}
return lambda;
}
}/**
* 首字母转换小写
*
* @param str 需要转换的字符串
* @return 转换好的字符串
*/
public static String firstToLowerCase(final String str) {
if (isBlank(str)) {
return EMPTY;
}
return str.substring(0, 1).toLowerCase() + str.substring(1);
}测试
public static void main(String[] args) {
String firstNameFieldNameStyle = ConvertUtil.convertToFieldName(User::getFirstName);
String firstNameUnderlineStyle = ConvertUtil.convertToUnderline(User::getFirstName);
System.out.println("firstNameFieldNameStyle:" + firstNameFieldNameStyle);
System.out.println("firstNameUnderlineStyle:" + firstNameUnderlineStyle);
}
想要深入研究的可以看这个链接:Lambda表达式获取传入的方法引用的方法名_社恐Coder的博客-CSDN博客
边栏推荐
猜你喜欢
随机推荐
The R language uses the rollapply function in the zoo package to apply the specified function to the time series in a rolling manner and the window moves, and set the align parameter to specify that t
字节跳动软件测试岗,收到offer后我却拒绝了~给面试的人一些忠告....
iNFTnews | Seeing the two sides of the metaverse, what is the true Internet and the Internet of value?
后管实现面包屑功能
全方位剖析Numpy中的np.diag源代码
MySQL百万数据优化总结 一
[Science of Terminology] For those difficult words about the integrated workbench, read this article to understand in seconds!
Three.JS程序化建模入门
yolov7创新点
The realization of the list
leetcode: 200. 岛屿数量
4年手工测试被应届生取代了,用血与泪的教训给xdm一个忠告,该学自动化了...
R language ggplot2 visualization: use the ggbarplot function of the ggpubr package to visualize the stacked bar plot, the lab.pos parameter specifies the position of the numerical label of the bar cha
Com多进程通信实现
有奖征集|TaoCloud&宝德联合举办全闪POC!
Turning and anti-climbing attack and defense
LayaBox---TypeScript---Decorator
Spearman's correlation coefficient
The ggline function of the R language ggpubr package visualizes grouped line graphs, the add parameter is mean_se and dotplot to visualize line graphs of different level averages, and adds error bars
保姆级教程:写出自己的移动应用和小程序(篇二)









