1.匿名内部类
提到lambda表达式首先要了解匿名内部类。匿名内部类多用于类只使用一次的情况,例如
interface Fruit{//定义一个Fruit接口
void eat();
}
public class Test01{
public static void eatfruit(Fruit fruit){//形参是一个Fruit实现类的对象
fruit.eat();//调用该对象的eat方法
}
public static void main(String[] args) {
Person p=new Person();
Test01.eatfruit(p);
}
}
class Person implements Fruit{//Person类实现了Fruit接口
public void eat(){
System.out.println("吃水果");
}
}
运行结果是:吃水果。其中eatfruit方法的形参是Fruit的一个实现类对象,我们可以创建一个类实现Fruit接口,然后将这个类的对象传入eatfruit方法中,但这种方法代码写的太多,可读性差,于是我们就可以使用匿名内部类,
interface Fruit{//定义一个Fruit接口
void eat();
}
public class Test01{
public static void eatfruit(Fruit fruit){//形参是一个Fruit实现类的对象
fruit.eat();//调用该对象的eat方法
}
public static void main(String[] args) {
Test01.eatfruit(new Fruit(){ //使用匿名内部类
public void eat(){
System.out.println("吃水果");
}
});
}
}
使用匿名内部类就是创建了一个没有名字的对象,这个对象就是实现了Fruit接口的实例(如果一个方法的形参是某个类的对象,也可以使用匿名内部类),运行结果:吃水果。然而这种方法还是有些繁琐,于是就有了lambda表达式。
2.lambda表达式
lambda表达式的格式是:()->{}。lambda表达式只适用于一个接口中只有一个抽象方法或一个类中只有一个抽象方法,如果有其它的抽象方法就会报错。lambda表达式的()中写的是抽象方法的形参,{}中写的是抽象方法的方法体。lambda表达式其实还是创建了一个没有名字的对象(因为是创建了对象,所以要实现抽象方法),如
interface Fruit{//定义一个Fruit接口
void eat();
}
public class Test01{
public static void eatfruit(Fruit fruit){//形参是一个Fruit实现类的对象
fruit.eat();//调用该对象的eat方法
}
public static void main(String[] args) {
Test01.eatfruit(()->{ //使用lambda表达式
System.out.println("吃水果");
});
}
运行结果:吃水果。括号中可以省略形参的类型,当形参只有一个时,也可省略括号。如果方法体中只有一个语句也可以把花括号以及语句后的分号省略。当这个抽象方法有返回值时,如果方法体中只有一个return语句,也可以把return省略,直接写返回值。
lambda表达式并不只是替代匿名内部类,它还有其它的用处,这里就不再说了(其实其它的我也不知道了...)。