我们在开发过程中,经常会使用 lambda 函数式编程,这样会更加简单。
1. 使用方式
比如下面有一个很简单的 User
类。其中有一个属性 username
1
2
3
4
5
6
7
8
9
10
11
12
13
| @Data
public class User {
private String username;
public String getPassword(String password) {
return password;
}
}
// 使用的方式
// user -> user.getUsername() 等价于 User::getUsername
Function<User, String> getUsername1 = User::getUsername
|
比如我现在要使用 user -> user.getUsername()
, 这样的 lambda 表达式来获取一个 User
对象的 username
属性值。
我现在可以这样来获取 username
这个方法名称。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
| public class LambdaUtils {
// 正常情况,要做缓存
public static <T> String resolveMethod(SFunction<T, ?> func) {
SerializedLambda serializedLambda = resovle(func);
String methodName = serializedLambda.getImplMethodName();
return methodName;
}
@SneakyThrows
public static SerializedLambda resovle(SFunction<?, ?> func) {
Method method = func.getClass().getDeclaredMethod("writeReplace");
method.setAccessible(true);
return (SerializedLambda) method.invoke(func);
}
}
|
2. 代码实现位置
本节的内容,我叙述的不是很好,可能看的一脸懵, 使用过 mybatis-plus
的人,可能会有点印象 LambdaQueryWrapper
,
推荐看下这个测试类 LambdaUtilsTests
github 地址