用途:匿名内部类简化了”函数式接口的实现“的代码书写,Lambda表达式可简化匿名内部类实现函数式接口的代码。
如何使用:
1.场景
小明有一只宠物猫,喜欢吃鱼,小明今天有事,要将猫送到动物饲养中心,由里面的饲养员进行喂食。该动物饲养中心可承接一切动物的喂养任务。
2.相关实体类和接口
2.1 定义了一个动物接口:Animal,声明了一个抽象方法:eat()
public interface Animal
{
abstract void eat();
}
2.2 定义了一个实体类:Cat,实现了Animal接口,重写了Animal接口中的抽象方法:eat()
public class Cat implements Animal
{
@Override
public void eat() {
System.out.println("it eat fish");
}
}
2.3 定义了一个实体类:AnimalKeeper,内部定义了一个方法:feedAnimal(),参数是Animal类对象
public class AnimalKeeper
{
public void feedAnimal(Animal animal)
{
animal.eat();
}
}
3.场景描述: 小明拿出猫(new),饲养中心派出饲养员(new),由饲养员喂猫
public class Test
{
public static void main(String[] args)
{
Animal animal=new Cat();
AnimalKeeper Jerry = new AnimalKeeper();
Jerry.feedAnimal(animal);
}
}
4.代码优化
4.1 小明不想把“自己的宠物是猫”这个事实告诉动物饲养中心,只是透露喂它吃鱼
函数式接口:有且仅有一个抽象方法的接口。函数式接口可以有多个非抽象方法,其实现可采用匿名内部类的方法,即不给出实现该接口的子类的名称,俗称匿名,但仍能实现该函数式接口,简化了代码。本文中的Animal接口就是典型的函数式接口,用匿名内部类实现该接口的代码如下:
new Animal()
{
@Override
public void eat()
{
System.out.println("it eat fish");
}
};
4.2 改进后的完整代码
public class Test
{
public static void main(String[] args)
{
AnimalKeeper Jerry = new AnimalKeeper();
Jerry.feedAnimal(new Animal()
{
@Override
public void eat()
{
System.out.println("it eat fish");
}
});
}
}
此代码的意思就是:我不必告诉你我拿来的动物的名称(种类),我只要告诉你它吃什么(重写的方法实现),你做好自己的喂养工作就行。
4.3 引入Lambda表达式再优化
匿名内部类已经帮我们省掉了new的步骤,但代码看起来仍比较臃肿,再优化书写:
public class Test
{
public static void main(String[] args)
{
AnimalKeeper Jerry = new AnimalKeeper();
Jerry.feedAnimal(()->{
System.out.println("it eat fish");
});
}
}
优化的地方:省去了new Animal,@Override和方法的壳,只写方法的实现。
5.注意事项
任意类和接口都可使用匿名内部类,但只有函数式接口才能使用Lambda表达式。