lambda概念
-
函数式编程思想的实现,lambda强调做什么,而不是用什么去做的语法,匿名内部类强调用什么去做,怎么做。
-
两个点:方法引用,lambda表达式可以值传递
-
lamda表达式前提就是要使用函数式接口
函数式接口
@FunctionalInterface修饰且只有一个抽象方法。
Java定义的函数式接口
Function<T, R> : R apply(T t); // 执行函数,需要指定入参跟出参
Predicate<T> : boolean test(T t); // 用来做判断,返回true、false,指定判断参数类型即可。可以通用的处理底层返回结果,noDate、dateNull、自定义判断规则
Supplier<T> : T get(); // 用来提供数据,不需要入参,指定提供什么类型出参即可
Consumer<T> : void accept(T t); // 用来消费,不需要出参,指定消费什么类型的参数即可
方法引用:
- 静态方法引用:类名::方法名
- 对象方法引用:
- 对象名::非静态方法名、
- 如果引用的方法对象,正好是lambda的参数,也可以写成类名::方法名。如mybatis中的获取字段名称
- 构造方法引用:类名::new
扩展
mybatis-plus如何实现,类名::字段名来获取字段名称?
- 先通过范型,确认SFuction的参数类型
- 通过SerializedLambda实现
定义了函数式接口: SFunction extend Function ,实现了序列化
eq(UserPO::getUsername)
-> 将SFunc序列化成SerializedLambda // 关键方法
-> 获取方法名,截取掉get、set、is,得到字段名,首字母转小写