Java中匿名内部类及lambda表达式
前言
Java中的内部类有四种,这篇文章重点将匿名内部类的意义、用法,然后导出jdk1.8的新特性——lambda表达式。
匿名内部类意义
假设一个场景,我们需要一个类来描述人会不会游泳。因为并不是所有人都会游泳,所以我们写一个接口,会游泳的人只需要实现这个接口。
public interface Swim {
void swimming();
}
如果我们现在需要知道某一类会游泳人的具体表现是什么,我们就需要写一个类实现Swim接口。例如我们想知道蛙泳的姿势,
public class Sportsman implements Swim{
@Override
public void swimming() {
System.out.println("娃泳的姿势像青蛙");
}
}
然后我们只需要new一个Sportsman对象,再调用方法就可以得到运行结果:“娃泳的姿势像青蛙”。
public class Test {
public static void main(String[] args) {
Sportsman sportsman = new Sportsman();
sportsman.swimming();
}
}
如果现在我们又需要自由泳、蝶泳等等游泳的姿势,我们是不是都要先定义一个类实现Swim呢?我们发现这类问题中关心的只是被重写方法的方法体,因此Java中出现匿名内部类帮我们简化这一操作。
public class Test {
public static void main(String[] args) {
new Swim() {
@Override
public void swimming() {
System.out.println("娃泳的姿势像青蛙");
}
}.swimming();;
}
}
通过这种new Swim()加花括号的方法,在花括号里重写方法,我们实现了Swim接口,并得到了一个对象,通过对象.方法名()的方式实现目标。可以说,匿名内部类的存在大大简化了代码量。
参数为接口类型的方法中使用匿名内部类
Java的多态性在参数为接口类型的方法中体现的很好,例如,show方法需要的是接口类型,我们需要传入一个接口实现类,这时我们还需要先写一个实现类,再创建对象传入参数吗?通过上面的讲解,我们可以用匿名内部类的方式实现。
public class Test {
public static void main(String[] args) {
//匿名内部类传参
show(new Swim() {
@Override
public void swimming() {
System.out.println("娃泳的姿势像青蛙");
}
});
}
//参数为接口的方法,用来展示泳姿
public static void show(Swim swim) {
swim.swimming();
}
}
lambda表达式
lambda表达式是jdk1.8新增特性,是为了进一步简化接口中只存在一个需要被重写的抽象方法的情况。这一类接口叫做函数式接口,在Java中用@FunctionalInterface来注解。
@FunctionalInterface
public interface Swim {
void swimming();
}
现在我们用lambda表达式来简化上面的匿名内部类代码
public class Test {
public static void main(String[] args) {
//lambda表达式
show(()->{
System.out.println("娃泳的姿势像青蛙");
});
}
//参数为接口的方法,用来展示泳姿
public static void show(Swim swim) {
swim.swimming();
}
}
lambda表达式的一般写法为
(被重写方法的参数列表) -> { 被重写方法的方法体 }
若想获得lambda表达式的匿名内部类对象的引用,可以这样写,
Swim swim = ()->{System.out.println("娃泳的姿势像青蛙");};
另外,lambda表达式还可以有更简化的写法,例如方法体中只有一句时,可以省略花括号。详细内容可以看Java中Lambda表达式的使用
文章纯手打,若有错误请及时指正。有问题的小伙伴也可以提问,我尽量回答,虽然我只是初学者。