当前位置:网站首页>通过方法引用获取方法名
通过方法引用获取方法名
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博客
边栏推荐
- LayaBox---TypeScript---Symbols
- 利用二维数据学习纹理三维网格生成(CVPR 2020)
- Why use BGP?
- R语言时间序列数据算术运算:使用log函数将时间序列数据的数值对数化、使用diff函数计算对数化后的时间序列数据的逐次差分(计算价格的对数差分)
- Geoffery Hinton: The Next Big Thing in Deep Learning
- Com多进程通信实现
- Oracle超全SQL,细节狂魔
- 软件测试岗位巨坑?阿里在职7年测试人告诉你千万别上当
- 4年手工测试被应届生取代了,用血与泪的教训给xdm一个忠告,该学自动化了...
- iNFTnews | Seeing the two sides of the metaverse, what is the true Internet and the Internet of value?
猜你喜欢

MySql tens of millions of paging optimization, fast insertion method of tens of millions of data

8年软件测试工程师的感悟:与薪资相匹配的永远是实力

npm ERR! 400 Bad Request - PUT xxx - Cannot publish over previously published version “1.0.0“.

配置mysql失败了,这是怎么回事呢?
![ASP.NET Core 6框架揭秘实例演示[31]:路由&quot;高阶&quot;用法](/img/57/821576ac28abc8d1c0d65df6a72fa3.png)
ASP.NET Core 6框架揭秘实例演示[31]:路由&quot;高阶&quot;用法

博云入选Gartner中国DevOps代表厂商

After 21 years of graduation, I switched to software testing. From 0 income to a monthly salary of over 10,000, I am really lucky...

yolov7创新点

为什么要使用BGP?

超赞!发现一个APP逆向神器!
随机推荐
如何选择一块真正“好用的、性能高”的远程控制软件
4年手工测试被应届生取代了,用血与泪的教训给xdm一个忠告,该学自动化了...
LayaBox---TypeScript---Advanced Type
LayaBox---TypeScript---Symbols
LayaBox---TypeScript---Mixins
wireshark的安装教程(暖气片安装方法图解)
只问耕耘,不问收获,其实收获却在耕耘中
windbg分析进程卡死
详细总结SoC、DSP、MCU、GPU和FPGA等基础概念
字节跳动软件测试岗,收到offer后我却拒绝了~给面试的人一些忠告....
Oracle超全SQL,细节狂魔
【面向校招】Golang面试题合集
LayaBox---TypeScript---Namespaces and modules
多大数量级会出现哈希碰撞
软件工程国考总结——选择题
情景剧《重走长征路》上演
LayaBox---TypeScript---Iterator and generator
365天挑战LeetCode1000题——Day 047 设计循环队列 循环队列
LayaBox---TypeScript---模块
sqlmap安装教程用w+r打开(sqlyog安装步骤)