lambda表达式
lambda是java8的新特性,现在都已经15了,再不学下真的要被骂了hhh
函数式接口
介绍lambda表达式之前说说函数式接口,函数式接口和普通接口没有什么区别,唯一的区别就是函数式接口只有一个抽象方法,只要一个接口中只有一个方法,那么该接口就可以被称为函数式接口。
lambda与其他形式的对比
最普通方式,某一个类实现一个接口,就称为该类是这个接口的实现类,通过创建实现类对象可以调用实现方法
interface USB{
void usbSize();
}
class Vivo implements USB{
public void usbSize(){
System.out.println("vivo手机的USB尺寸");
}
}
public class Test{
public static void mian(String[] args){
USB vivo = new Vivo();
vivo.usbSize();
}
}
匿名内部类方式,匿名内部类的形式没有类的名称,通过抽象类名和接口来实现抽象方法
interface USB{
void usbSize();
}
public class Test{
public static void mian(String[] args){
USB xiaoMi = new USB(){
public void usbSize() {
System.out.println("小米手机的USB尺寸");
}
};
}
}
lambda表达式的形式
interface USB{
void usbSize();
}
public class Test{
public static void mian(String[] args){
USB huaWei = ()->{
System.out.println("华为手机的USB尺寸");
};
}
}
其中,(形参列表)->{
抽象方法usbSize的具体实现
}
- 当形参列表没有时,直接写()->{}的形式,即上面的例子
- 当形参列表有多个参数时,参数类型可以不写,直接写(a,b)->{}的形式,如果不写参数类型则所有参数类型都不能写
- 当形参列表只有一个参数时,可以省掉小括号,直接写a->{}的形式
- 当实现方法中只有一条语句时,大括号可以省略掉,直接写a->System.out.println(“华为手机的USB尺寸”);
通过对比,可以发现lambda表达式是匿名内部类的精简版,但其自身也有很多限制,其一,lambda表达式虽然简化代码但可读性变差了,其二,lambda表达式只适用于函数式接口,即只能重写接口一个方法
静态代理模式
静态代理是,接口的实现类并不直接创建对象调用实现方法,而是将实现类对象交给另一个实现类,即交给代理类,由代理类去执行实现类中的实现方法,代理类还可以在执行实现方法前后加入自己的方法,使得程序更加健壮。
Thread就是典型的代理类,Thread类也是实现了Runnable接口,当我们自定义类实现Runnable接口后,将自定义类对象通过Thread构造方法交给Thread后,由Thread类代替我们去执行我们的实现方法,即调用start方法。
下面以一个例子说明
Marry接口
public interface Marry {
void happyMarry();
}
You自定义实现类
public class You implements Marry {
@Override
public void happyMarry() {
System.out.println("俺要结婚啦,,,");
}
}
Wedding代理类
public class Wedding implements Marry {
Marry marry;
public Wedding(Marry marry) {
this.marry = marry;
}
@Override
public void happyMarry() {
System.out.println("代理类中的实现方法可以不写任何东西");
}
public void start() {
beforeMarry();
marry.happyMarry();
afterMarry();
}
private void afterMarry() {
System.out.println("结婚后,找新郎新娘结账");
}
private void beforeMarry() {
System.out.println("结婚前,布置婚礼现场");
}
}
StaticProxy测试类
public class StaticProxy{
public static void main(String[] args) {
/*
* You类和Wedding代理类都继承Marry接口,将You类对象交给代理类去执行
* */
/*You you = new You();
new Wedding(you).start();*/
//匿名内部类
/*new Wedding(new Marry() {
@Override
public void happyMarry() {
System.out.println("洞房花烛夜");
}
}).start();*/
//lambda,因为Marry接口只有一个抽象方法,所以也可以用lambda方式
new Wedding(()-> System.out.println("送入洞房")).start();
//Thread的lambda方式
//new Thread(()-> System.out.println("自定义类中的实现方法")).start();
}
}