Mybatis-plus进阶篇(三)

打印 上一主题 下一主题

主题 551|帖子 551|积分 1653

1.1 Lambda表达式的语法

基本语法:

(parameters) -> expression 或 (parameters) ->{ statements; }
Lambda表达式由三部分构成:


  • paramaters:类似方法中的形参列表,这里的参数是函数式接口里的参数。这里的参数类型可以明确的声明也可不声明而由JVM隐含的推断。另外当只有一个推断类型时可以省略掉圆括号。
  • ->:可理解为“被用于”的意思
  • 方法体:可以是表达式也可以代码块,是函数式接口里方法的实现。代码块可返回一个值或者什么都不反回,这里的代码块块等同于方法的方法体。假如是表达式,也可以返回一个值或者什么都不反回。
最经典的比如java中的forEach方法:
  1. import java.util.Arrays;
  2. import java.util.List;
  3. public class LambdaExample {
  4.     public static void main(String[] args) {
  5.         List<String> list = Arrays.asList('潘', '家', '辉', '别', '雪', '了');
  6.         // Lambda表达式作为参数传递给forEach方法
  7.         list.forEach(list -> System.out.print(list+" "));
  8.     }
  9. }
复制代码
1.2 函数式接口

要了解 Lambda 表达式 , 起首需要了解什么是函数式接口,
函数式接口定义:

一个接口有且只有一个抽象方法 。
注意:

  • 假如一个接口只有一个抽象方法,那么该接口就是一个函数式接口
  • 假如我们在某个接口上声明了 @FunctionalInterface 注解,那么编译器就会按照函数式接口的定义来要求该接口,如许假如有两个抽象方法,程序编译就会报错的。以是,从某种意义上来说,只要你保证你的接口中只有一个抽象方法,你可以不加这个注解。加上就会自动进行检测的。
  1. // 定义一个函数式接口
  2. @FunctionalInterface
  3. interface Task {
  4. //注意只能有一个方法
  5.     void perform();
  6. }
  7. public class LambdaExample {
  8.     public static void main(String[] args) {
  9.         // 创建一个助手对象,使用Lambda表达式实现任务
  10.         Task assistant = () -> System.out.println("助手正在切洋葱...");
  11.         // 调用厨师的方法,传递助手对象执行任务
  12.         cookMeal(assistant);
  13.     }
  14.     public static void cookMeal(Task task) {
  15.         // 准备食材
  16.         System.out.println("准备食材...");
  17.         // 执行任务
  18.         task.perform();
  19.         // 煮菜
  20.         System.out.println("开始烹饪...");
  21.     }
  22. }
复制代码
假如在接口再定义一个方法,则会报错。
1.3 方法引用

先来看一下什么是方法引用:
方法引用着实是Lambda表达式的另一种写法,当要转达给Lambda体的操纵,已经有实现的方法了,可以使用方法引用;
注意: 实现抽象方法的参数列表,必须与方法引用方法的参数列表保持一致!
方法引用:使用操纵符::将方法名和对象或类的名字分隔开来,三种主要使用情况为
  1. 对象::实例方法
  2. 类::静态方法
  3. 类::实例方法
复制代码
对象::实例方法

  1. import java.util.function.Consumer;
  2. public class MyTest {
  3.     public static void main(String[] args) {
  4.         Consumer<String> consumer = new Consumer<String>() {
  5.             @Override
  6.             public void accept(String s) {
  7.                 System.out.println(s);
  8.             }
  9.         };
  10.         consumer.accept("aaaaaaaaaaaaaa");
  11.         //aaaaaaaaaaaaaa
  12.         //简写1:
  13.         Consumer<String> consumer1 = (String s) -> {
  14.             System.out.println(s);
  15.         };
  16.         consumer1.accept("abc");
  17.         //abc
  18.         //简写2:
  19.         Consumer<String> consumer2 = (s) -> System.out.println(s);
  20.         consumer2.accept("bcd");
  21.         //bcd
  22.         //简写3:
  23.         Consumer<String> consumer3 = System.out::println;
  24.         consumer3.accept("abc");
  25.         //abc
  26.     }
  27. }
复制代码
类::静态方法

  1. import java.util.function.BinaryOperator;
  2. public class MyTest1 {
  3.     public static void main(String[] args) {
  4.         BinaryOperator<Double> operator = new BinaryOperator<Double>(){
  5.             @Override
  6.             public Double apply(Double o, Double o2) {
  7.                 return Math.max(o,o2);
  8.             }
  9.         };
  10.         System.out.println(operator.apply(2.13, 3.12));//3.12
  11.         BinaryOperator<Double> operator2 = (o, o2) -> Math.max(o,o2);
  12.         System.out.println(operator2.apply(2.13, 3.12));//3.12
  13.         BinaryOperator<Double> operator3 = Math::max;
  14.         Double max = operator3.apply(5.0, 20.0);
  15.         System.out.println(max);//20.0
  16.     }
  17. }
复制代码
类::实例方法

  1. import java.util.Comparator;
  2. public class MyTest2 {
  3.     public static void main(String[] args) {
  4.         Comparator<String> comparator = new Comparator<String>() {
  5.             @Override
  6.             public int compare(String o1, String o2) {
  7.                 return o1.compareTo(o2);
  8.             }
  9.         };
  10.         System.out.println(comparator.compare("20", "12"));//1
  11.         Comparator<String> comparator1 = String::compareTo;
  12.         System.out.println(comparator1.compare("20", "12"));//1
  13.     }
  14. }
复制代码
1.4 构造引用

格式:ClassName::new
与函数式接口相结合,自动与函数式接口中方法兼容。可以把构造器引用赋值给定义的方法,与构造器参数列表要与接口中抽象方法的参数列表一致!
  1. import java.util.function.Supplier;
  2. public class Mytest {
  3.     public static void main(String[] args) {
  4.         Supplier<Student> supplier = new Supplier<Student>() {
  5.             @Override
  6.             public Student get() {
  7.                 return new Student();
  8.             }
  9.         };
  10.         Student student = supplier.get();
  11.         Supplier<Student> supplier1 = () -> new Student();
  12.         Student student1 = supplier1.get();
  13.     }
  14. }
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

守听

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表