Lambda表达式的使用场景:
仅适用于函数式接口的匿名内部类
什么是函数式接口?
函数式接口一般用@FunctionalInterface来标注,接口中有且仅有一个抽象方法。
Lambda表达式的格式
(形参参数值)-> {方法体}
简化原则
- 如果形参只有一个,可以省略左右括号
- 如果方法体内只有一行代码,可以省略大括号,省略大括号时,必须省略分号,如果有return也必须要省略。
- 方法体仅是调用一个静态方法,并且前后形参相同,可以使用静态方法引用。类名::方法名
- 方法体仅是调用一个实例方法,并且前后形参相同,可以使用实例方法引用。对象::方法名
- 方法体仅调用一个实例方法,且以前一个参数作为方法调用方,后一个参数作为入参,此时可以使用特定类型引用。类型::方法
- 方法体只是用来创建一个对象,且方法的参数与创建对象的方法参数一致,可以使用构造器引用。类名::new
public class TestLambda {
public static void main(String[] args) {
/****对象数组排序****/
Students s1 = new Students(5,100.5);
Students s2 = new Students(8,140.5);
Students s3 = new Students(6,110.5);
Students[] studentsArr = {s1,s2,s3};
Arrays.sort(studentsArr, new Comparator<Students>() {
@Override
public int compare(Students o1, Students o2) {
// return o1.getAge()-o2.getAge(); // 按年龄升序排列
return Double.compare(o2.getHeigth(),o1.getHeigth()); // 按身高倒序排列
}
});
// (形参的参数值)->{方法体}
Arrays.sort(studentsArr, (o1, o2) -> {
return Double.compare(o2.getHeigth(), o1.getHeigth()); // 按身高倒序排列
});
// 如果方法体内只有一行代码,可以省略大括号,省略大括号时,必须省略分号,如果有return也必须要省略。
Arrays.sort(studentsArr, (o1, o2) -> Double.compare(o2.getHeigth(), o1.getHeigth()));
// 方法体仅是调用一个静态方法,并且前后形参相同,可以使用静态引用::
Arrays.sort(studentsArr, TestLambda::compare);
}
public static int compare(Students s1,Students s2){
return Double.compare(s2.getHeigth(), s1.getHeigth());
}
static class Students{
private int age;
private double heigth;
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public double getHeigth() {
return heigth;
}
public void setHeigth(double heigth) {
this.heigth = heigth;
}
public Students(int age, double heigth) {
this.age = age;
this.heigth = heigth;
}
@Override
public String toString() {
return "Students{" + "age=" + age + ", heigth=" + heigth + '}';
}
}
特定类型引用
String[] names = {"Angel","Lily","Benki","anny","bob"};
// 排序时忽略大小写
Arrays.sort(names,(o1, o2) -> o1.compareToIgnoreCase(o2));
// 方法体仅调用一个实例方法,且以前一个参数作为方法调用方,后一个参数作为入参,此时可以使用特定类型引用。类型::方法
Arrays.sort(names,String::compareToIgnoreCase);