二、Lambda表达式
接下来,我们学习一个JDK8新增的一种语法形式,叫做Lambda表达式。作用:用于简化匿名内部类代码的书写。
2.1 Lambda表达式基本使用
怎么去简化呢?Lamdba是有特有的格式的,按照下面的格式来编写Lamdba。
(被重写方法的形参列表) -> { 被重写方法的方法体代码; }
需要给说明一下的是,在使用Lambda表达式之前,必须先有一个接口,而且接口中只能有一个抽象方法。(注意:不能是抽象类,只能是接口)
像这样的接口,我们称之为函数式接口,只有基于函数式接口的匿名内部类才能被Lambda表达式简化。
public interface Swimming{ void swim(); }
有了以上的Swimming接口之后,接下来才能再演示,使用Lambda表达式,简化匿名内部类书写。
public class LambdaTest1 { public static void main(String[] args) { // 目标:认识Lambda表达式. //1.创建一个Swimming接口的匿名内部类对象 Swimming s = new Swimming(){ @Override public void swim() { System.out.println("学生快乐的游泳~~~~"); } }; s.swim(); //2.使用Lambda表达式对Swimming接口的匿名内部类进行简化 Swimming s1 = () -> { System.out.println("学生快乐的游泳~~~~"); }; s1.swim(); } }
好的,我们现在已经知道Lamdba表达式可以简化基于函数式接口的匿名内部类的书写。接下来,我们可以把刚才使用Arrays方法时的代码,使用Lambda表达式简化一下了。
public class LambdaTest2 { public static void main(String[] args) { // 目标:使用Lambda简化函数式接口。 double[] prices = {99.8, 128, 100}; //1.把所有元素*0.8: 先用匿名内部类写法 Arrays.setAll(prices, new IntToDoubleFunction() { @Override public double applyAsDouble(int value) { // value = 0 1 2 return prices[value] * 0.8; } }); //2.把所有元素*0.8: 改用Lamdba表达式写法 Arrays.setAll(prices, (int value) -> { return prices[value] * 0.8; }); System.out.println(Arrays.toString(prices)); System.out.println("-----------------------------------------------"); Student[] students = new Student[4]; students[0] = new Student("蜘蛛精", 169.5, 23); students[1] = new Student("紫霞", 163.8, 26); students[2] = new Student("紫霞", 163.8, 26); students[3] = new Student("至尊宝", 167.5, 24); //3.对数组中的元素按照年龄升序排列: 先用匿名内部类写法 Arrays.sort(students, new Comparator<Student>() { @Override public int compare(Student o1, Student o2) { return Double.compare(o1.getHeight(), o2.getHeight()); // 升序 } }); //4.对数组中的元素按照年龄升序排列: 改用Lambda写法 Arrays.sort(students, (Student o1, Student o2) -> { return Double.compare(o1.getHeight(), o2.getHeight()); // 升序 }); System.out.println(Arrays.toString(students)); } }
好的,各位同学,恭喜大家!到这里,你已经学会了Lambda表达式的基本使用了。
2.2 Lambda表达式省略规则
刚才我们学习了Lambda表达式的基本使用。Java觉得代码还不够简单,于是还提供了Lamdba表达式的几种简化写法。具体的简化规则如下
1.Lambda的标准格式 (参数类型1 参数名1, 参数类型2 参数名2)->{ ...方法体的代码... return 返回值; } 2.在标准格式的基础上()中的参数类型可以直接省略 (参数名1, 参数名2)->{ ...方法体的代码... return 返回值; } 3.如果{}总的语句只有一条语句,则{}可以省略、return关键字、以及最后的“;”都可以省略 (参数名1, 参数名2)-> 结果 4.如果()里面只有一个参数,则()可以省略 (参数名)->结果
接下来从匿名内部类开始、到Lambda标准格式、再到Lambda简化格式,一步一步来简化一下。同学们体会一下简化的过程。
public class LambdaTest2 { public static void main(String[] args) { // 目标:使用Lambda简化函数式接口。 double[] prices = {99.8, 128, 100}; //1.对数组中的每一个元素*0.8: 匿名内部类写法 Arrays.setAll(prices, new IntToDoubleFunction() { @Override public double applyAsDouble(int value) { // value = 0 1 2 return prices[value] * 0.8; } }); //2.需求:对数组中的每一个元素*0.8,使用Lambda表达式标准写法 Arrays.setAll(prices, (int value) -> { return prices[value] * 0.8; }); //3.使用Lambda表达式简化格式1——省略参数类型 Arrays.setAll(prices, (value) -> { return prices[value] * 0.8; }); //4.使用Lambda表达式简化格式2——省略() Arrays.setAll(prices, value -> { return prices[value] * 0.8; }); //5.使用Lambda表达式简化格式3——省略{} Arrays.setAll(prices, value -> prices[value] * 0.8 ); System.out.println(Arrays.toString(prices)); System.out.println("------------------------------------ Student[] students = new Student[4]; students[0] = new Student("蜘蛛精", 169.5, 23); students[1] = new Student("紫霞", 163.8, 26); students[2] = new Student("紫霞", 163.8, 26); students[3] = new Student("至尊宝", 167.5, 24); //1.使用匿名内部类 Arrays.sort(students, new Comparator<Student>() { @Override public int compare(Student o1, Student o2) { return Double.compare(o1.getHeight(), o2.getHeight()); // 升序 } }); //2.使用Lambda表达式表达式——标准格式 Arrays.sort(students, (Student o1, Student o2) -> { return Double.compare(o1.getHeight(), o2.getHeight()); // 升序 }); //3.使用Lambda表达式表达式——省略参数类型 Arrays.sort(students, ( o1, o2) -> { return Double.compare(o1.getHeight(), o2.getHeight()); // 升序 }); //4.使用Lambda表达式表达式——省略{} Arrays.sort(students, ( o1, o2) -> Double.compare(o1.getHeight(), o2.getHeight())); System.out.println(Arrays.toString(students)); } }
到这里,恭喜你,对Lamdba表达式的所有写法,就学习完毕了。