一、Lambda表达式的介绍
Lambda表达式是 Java8 中最重要的新功能之一。使用 Lambda 表达
式可以替代只有一个抽象函数的接口实现,告别匿名内部类,代码看
起来更简洁易懂。Lambda表达式同时还提升了对集合、框架的迭代、
遍历、过滤数据的操作。
lambda表达式可以替代只有一个抽象函数的接口实现,告别匿名内部类,代码看起来更简洁易懂
lambda表达式同时还提升了对集合、框架的迭代、遍历、过滤数据的操作
lambda可以极大的减少代码冗余,同时代码的可读性要好过冗长的内部类,匿名类
例如以前我们使用匿名内部类来实现代码:
Runnable runnable = new Runnable() { @Override public void run() { System.out.println("running1 ....."); } }; runnable.run();使用lambda表达式实现更简洁的代码:
Runnable runnable3 = ()-> System.out.println("running2...."); runnable3.run();lambda表达式语法:
LambdaParameters -> LambdaBodyargs -> expr或者(object ... args)-> {函数式接口抽象方法实现逻辑}
1、()参数的个数,根据函数式接口里面抽象的参数个数来决定,当参数只有一个的时候,()可以省略
2、当expr逻辑非常简单的时候,{}和return可以省略
案例说明:
public static void main(String[] args) throws Exception { Callable<String> c1 = new Callable() { @Override public String call() throws Exception { return "muxiaonong"; } }; System.out.println(c1.call()); Callable<String> c2 = ()->{return "muxiaonong2";}; System.out.println(c2.call()); //逻辑很简单的时候省略 {} 和 return Callable<String> c3 = ()->"muxiaonong3"; System.out.println(c3.call()); } 二、Lambda表达式的特点函数式编程
参数类型自动推断
代码量少,简洁
三、Lambda表达式案例实现方式列表:
()->{} ()->{System.out.println(1);} ()->System.out.println(1) ()->{return 100;} ()->100 ()->null (int x)->{return x+1;} (int x)->x+1 (x)->x+1 x->x+1案例1:线程实现方式:
public static void main(String[] args) { //匿名内部类方式 new Thread(new Runnable() { @Override public void run() { System.out.println("runing1.........."); } }); //Lambda表达式方式 new Thread(() -> {System.out.println("runing2.....");}).start(); }案例2:集合遍历实现方式
public static void main(String[] args) { List<String> list = Arrays.asList("java","python","scala","javascript"); //普通匿名内部类方式 Collections.sort(list, new Comparator<String>() { @Override public int compare(String o1, String o2) { return o1.length() - o2.length(); } }); //Lambda方式 Collections.sort(list,(a,b) -> a.length() - b.length()); list.forEach(System.out::println); } 四、Lambda表达式的应用场景重要的事情说三遍:任何有函数式接口的地方 * 3
什么是函数式接口: 只有一个抽象方法(Object类中的方法除外)的接口是函数式接口
五、Lambda表达式实际应用 5.1 无参实体类模拟模拟数据库连接层:
@FunctionalInterface public interface StudentDao { void insert(Student student); }实体类
/** @Author mxn * @Description 学生实体类 * @Date 10:19 2020/11/7 * @Param * @return **/ public class Student { } public static void main(String[] args) { StudentDao sd1 = new StudentDao() { @Override public void insert(Student student) { System.out.println("插入学生1"); } }; StudentDao sd2 = (student)->{ System.out.println("student: "+student); }; StudentDao sd3 = (Student student)-> System.out.println("student3:"+student); sd1.insert(new Student()); //输出 插入学生1 sd2.insert(new Student());// 输出 sd3.insert(new Student());// 输出 } 5.2 有参实体类模拟实体类
/** @Author mxn * @Description * @Date 10:26 2020/11/7 * @Param * @return **/ public class Teacher { }接口模拟层
@FunctionalInterface public interface TeacherDao { int get(Teacher teacher); }实现层
public static void main(String[] args) { TeacherDao td1 = new TeacherDao() { @Override public int get(Teacher teacher) { return 1; } }; TeacherDao td2 = (teacher)->{return 2;}; TeacherDao td3 = (Teacher teacher)->{return 3;}; TeacherDao td4 = (teacher)->4; TeacherDao td5 = (Teacher teacher)->5; System.out.println(td1.get(new Teacher()));//输出 1 System.out.println(td2.get(new Teacher()));//输出 2 System.out.println(td3.get(new Teacher()));//输出 3 System.out.println(td4.get(new Teacher()));//输出 4 System.out.println(td5.get(new Teacher()));//输出 5 } 六、函数式接口