匿名内部类与函数式编程
匿名内部类
定义:匿名内部类是只创建一次对象时使用的特殊内部类,在需要创建一个只使用一次的类的对象时,使用匿名内部类可以让代码更加简洁。可以把它想象成一个“一次性演员”,在特定的场景下临时登场表演一次,表演结束后就不再需要它了。
即时定义与实例化:在new
关键字后直接定义类体并创建实例,常用于事件监听、线程实现等场景。
函数式编程
Lambda表达式:
jdk8开始新增的一种语法形式,它并表示函数,可以用于替代某些匿名内部类,从而让程序更简洁,可读性更好。Lambda并不是可以简化全部的匿名内部类,Lambda只能简化函数式接口的匿名内部类。
函数式接口:有且只有一个抽象方法的接口
@FuctionalInterface是声明函数式接口的注解
Swim s1=new Swim(){
@0verride
public void swimming()f
System.out.println("学生游泳贼快~~~~");
}
Swim s1=()->{
System.out.println("学生游泳贼快~~~~");
}
s1.swimming();
}
@FunctionalInterface//声明函数式接口的注解。
interface Swim{
void swimming();
}
Lambda表达式的省略规则
作用:进一步简化Lambda表达式的写法
具体规则:
参数类型全部可以省略不写。
如果只有一个参数,参数类型省略的同时“()”也可以省略,但多个参数不能省略“()”
如果Lambda表达式中只有一行代码,大括号可以不写,同时要省略分号“;”
如果这行代码是return语句,也必须去掉return。
Arrays.sort(students,new Comparator<Student>(){
@0verride
public int compare(student o1,Student o2){
return o1.getAge()-o2.getAge();//按照年龄升序!
});
Arrays.sort(students,(student o1,Studento2)->{
return o1.getAge()-o2.getAge();//按照年龄升序!
});
Arrays.sort(students,(o1,02)->{
return o1.getAge()-o2.getAge();//按照年龄升序!
});
Arrays.sort(students,(o1,02)->01.getAge()-o2.getAge());
静态方法的引用
类名::静态方法
使用场景:
如果某个Lambda表达式里只是调用一个静态方法,并且“→”前后参数的形式一致,就可以使用静态方法引用
实例方法使用
对象名::实例方法
使用场景:如果某个Lambda表达式里只是通过对象名称调用一个实例方法,并且“→”前后参数的形式一致,就可以使用实例方法引用。
特定类的方法引用
特定类的名称::方法
使用场景:如果某个Lambda表达式里只是调用一个特定类型的实例方法,并且前面参数列表中的第一个参数是作为方法的主调,后面的所有参数都是作为该实例方法的入参的,则此时就可以使用特定类型的方法引用。
构造器引用
类名::new
使用场景:如果某个Lambda表达式里只是在创建对象,并且“→”前后参数情况一致,就可以使用构造器引用。