lambda-学习

114 阅读1分钟

lambda概念

  1. 函数式编程思想的实现,lambda强调做什么,而不是用什么去做的语法,匿名内部类强调用什么去做,怎么做。

  2. 两个点:方法引用,lambda表达式可以值传递

  3. 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);  //  用来消费,不需要出参,指定消费什么类型的参数即可

方法引用:

  • 静态方法引用:类名::方法名
  • 对象方法引用:
    1. 对象名::非静态方法名、
    2. 如果引用的方法对象,正好是lambda的参数,也可以写成类名::方法名。如mybatis中的获取字段名称
  • 构造方法引用:类名::new

扩展

mybatis-plus如何实现,类名::字段名来获取字段名称?

  1. 先通过范型,确认SFuction的参数类型

image.png

  1. 通过SerializedLambda实现
定义了函数式接口: SFunction extend Function ,实现了序列化

eq(UserPO::getUsername)

-> 将SFunc序列化成SerializedLambda  // 关键方法

-> 获取方法名,截取掉get、set、is,得到字段名,首字母转小写