一、匿名内部类和lambda有几分相似的地方
1、无需创建类
2、lambda将匿名内部类达到了极致
3、外部变量都有作用域,在匿名内部类和lambda实现方法内不可以改变外部变量的值,java8之后不用声明final,但是不可以被后面的代码改值。(即隐性的具有 final 的语义)
二、匿名内部类
1、匿名内部类一定是接口的实现或者抽象类的子类(实现抽象方法)
//抽象方法
public abstract class AbstarctGoodService implements GoodService{
@Override
public String test1(String str){
return str;
}
}
//接口
public interface GoodService {
String test1(String str);
String test2(String str);
}
2、匿名内部类如何用
public class InnerTest {
public static void main(String[] args){
//实现接口
GoodService goodService = new GoodService() {
@Override
public String test1(String str) {
System.out.println("实现接口test1方法,距离过年还有5天");
return str;
}
@Override
public String test2(String str) {
System.out.println("实现接口test2方法,距离过年还有5天");
return str;
}
};
goodService.test1("31");
goodService.test2("13");
//实现抽象类
GoodService abstarctGoodService = new AbstarctGoodService(){
@Override
public String test2(String str) {
System.out.println("实现抽象类test2方法,距离过年还有5天");
return str.substring(0,2);
}
};
abstarctGoodService.test2("123");
}
}
3、匿名内部类没有构造器,且一般情况下,引用的外部变量需final修饰;
三、lambda表达式
1、lamda在java8后出现的。
2、lamda的定义,即代码实现
//lambda必须依赖接口,且接口方法只能有一个
public interface FoodService {
String eat(String apple,String orange);
}
//
public class EatService {
private static String eat(String a,String b,FoodService foodService){
System.out.println("执行eat方法");
//FoodService 不同的实现类,执行的eat方法内容不同
return foodService.eat(a,b);
}
public static void main(String[] args){
//实现类1
FoodService foodService = (a,b) -> {System.out.println("执行lamda_1: ".concat(a.concat(b))); return a.concat(b);};
//实现类2
FoodService ljService = (a,b) -> {System.out.println("执行lamda_2: ".concat(b)); return b;};
//eat方法调用不同的lamdba实现类
eat("a","1",foodService);
eat("m","nnn",ljService);
}
}
执行结果:
执行eat方法
执行lamda_1: a1
执行eat方法
执行lamda_2: nnn
3、注意点:
1、在 Lambda 表达式当中不允许声明一个与局部变量同名的参数或者局部变量,以下代码会报错
public static void main(String[] args){
String a = "123";
FoodService foodService = (a,b) -> {System.out.println("执行lamda_1: ".concat(a.concat(b))); return a.concat(b);};
FoodService ljService = (a,b) -> {System.out.println("执行lamda_2: ".concat(b)); return b;};
}
好了,今天的匿名内部类和lambda就讲到这里,有不足遗漏的地方,大家在下面留言。博主也会自查不足的地方,想到了会补上来,谢谢大家,手动敲的手累,动动小手给个鼓励的赞赞呗。