当前位置:网站首页>通过方法引用获取方法名
通过方法引用获取方法名
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博客
边栏推荐
- How to choose a truly "easy-to-use, high-performance" remote control software
- Rear tube implements breadcrumb function
- 21天学习挑战赛--第一天打卡(屏幕密度)
- 21年毕业转行软件测试,从0收入到月薪过万,我真的很幸运...
- DVWA Clearance Log 2 - Command Injection
- 有奖征集|TaoCloud&宝德联合举办全闪POC!
- Event object, do you know it well?
- You Only Hypothesize Once: 用旋转等变描述子估计变换做点云配准(已开源)
- The heavyweights are coming!Spoilers for the highlights of the Alibaba Cloud Life Science and Intelligent Computing Summit
- 循环结构--do-while循环
猜你喜欢

从众多接口中脱颖而出的最稳定的接口——淘宝详情api

Hello, my new name is "Bronze Lock/Tongsuo"

Do you agree with this view?Most businesses are digitizing just to ease anxiety

如何选择一块真正“好用的、性能高”的远程控制软件

How to choose a truly "easy-to-use, high-performance" remote control software

Three.JS程序化建模入门

You Only Hypothesize Once: 用旋转等变描述子估计变换做点云配准(已开源)

神通数据库,批量插入数据的时候失败

超赞!发现一个APP逆向神器!
![ASP.NET Core 6框架揭秘实例演示[31]:路由&quot;高阶&quot;用法](/img/57/821576ac28abc8d1c0d65df6a72fa3.png)
ASP.NET Core 6框架揭秘实例演示[31]:路由&quot;高阶&quot;用法
随机推荐
【面向校招】Golang面试题合集
如何安装dosbox(pycharm详细安装教程)
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
yolov7 innovation point
保姆级教程:写出自己的移动应用和小程序(篇二)
如何封装微信小程序的 wx.request() 请求
程序员的浪漫七夕
38岁女儿不恋爱没有稳定工作老母亲愁哭
Turning and anti-climbing attack and defense
阿里CTO程立:阿里巴巴开源的历程、理念和实践
Three.JS程序化建模入门
Weak yen turns game consoles into "financial products" in Japan: scalpers make big profits
DirectX修复工具增强版「建议收藏」
字节跳动软件测试岗,收到offer后我却拒绝了~给面试的人一些忠告....
21年毕业转行软件测试,从0收入到月薪过万,我真的很幸运...
云原生应用平台的核心模块有哪些
牛客刷题——剑指offer(第三期)
R language time series data arithmetic operation: use the log function to log the time series data, and use the diff function to calculate the successive difference of the logarithmic time series data
DVWA Clearance Log 2 - Command Injection
How to encapsulate the wx.request() request of WeChat applet