当前位置:网站首页>通过方法引用获取方法名
通过方法引用获取方法名
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博客
边栏推荐
猜你喜欢
如何搭建威纶通触摸屏与S7-200smart之间无线PPI通信?
同样做软件测试,和月收入 3W 的学弟聊了一晚上,我彻底崩溃了
yolov7创新点
Mysql环境变量的配置(详细图解)
从测试入门到测试架构师,这10年,他是这样让自己成才的
Turning and anti-climbing attack and defense
Jay Chou's new song is released, crawl the "Mojito" MV barrage, and see what the fans have to say!
零代码工具推荐---HiFlow
Linux system uninstall, install, upgrade, migrate clickHouse database
深度学习100例 —— 卷积神经网络(CNN)实现mnist手写数字识别
随机推荐
Mysql环境变量的配置(详细图解)
5G基础学习1、5G网络架构、网络接口及协议栈
初探zend引擎
Three.JS程序化建模入门
List-based queuing and calling system
Com多进程通信实现
The 38-year-old daughter is not in love and has no stable job, the old mother is crying
Turning and anti-climbing attack and defense
365天挑战LeetCode1000题——Day 047 设计循环队列 循环队列
How to encapsulate the wx.request() request of WeChat applet
The ggbarplot function of the R language ggpubr package visualizes the grouped histogram, sets the add parameter to mean_se to visualize the histogram of the mean values of different levels and adds
LayaBox---TypeScript---装饰器
npm ERR! 400 Bad Request - PUT xxx - Cannot publish over previously published version “1.0.0“.
云原生应用平台的核心模块有哪些
从零开始Blazor Server(5)--权限验证
一款优秀的中文识别库——ocr
LayaBox---TypeScript---命名空间和模块
ASP.NET Core 6框架揭秘实例演示[31]:路由&quot;高阶&quot;用法
MySql tens of millions of paging optimization, fast insertion method of tens of millions of data
小几届的学弟问我,软件测试岗是选11k的华为还是20k的小公司,我直呼受不了,太凡尔赛了~