java8新特性-lambda表达式
关于lambda表示式,它的本质就是匿名内部类一种。
复习一下匿名内部类
使用场景:当类或接口类型作为参数传递时,可以直接使用匿名内部类方式创建对应的对象
匿名内部类的嵌套使用
参考这篇:https://blog.csdn.net/u013771764/article/details/82937903
使用Lambda表达式简化匿名内部类的书写,但Lambda表达式并不能取代所有的匿名内部类,只能用来取代函数接口(Functional Interface)的简写。
能够使用Lambda的依据是必须有相应的函数接口(函数接口,是指内部只有一个抽象方法的接口)。
@FunctionalInterface 检查是否是函数式接口
lambda表达式省略了接口名和函数名
public class Test { interface Fun{ void say();//接口中的抽象方法abstract 可以省略 } public static void main(String[] args) { Test test = new Test(); test.play();
//lambda表达式 Fun fun = () -> System.out.println("3"); fun.say(); } public void play(){ //匿名内部类 Fun f=new Fun(){ @Override public void say() { System.out.println("f"); } }; f.say(); } }
上面是无参函数简写,如果是有参函数:
(参数列表)->{return 返回值}
可以省略参数列表的类型 编译器可以统一识别参数值。
public class Test { interface Fun{ void say(int x,int y);//接口中的抽象方法abstract 可以省略 } public static void main(String[] args) { Fun fun = (x,y) -> { x=x+y; y=2*x; System.out.println("x="+x+",y="+y);}; fun.say(3,4); } }
lambda中可以使用成员变量,局部变量,但是使用过局部变量以后,该局部变量就必须为final,所以不能再修改了。
(1)不需要声明参数类型,编译器可以统一识别参数值。
(2)一个参数无需定义圆括号,但多个参数需要定义圆括号。
(3)lambda 表达式的局部变量可以不用声明为 final,但是必须不可被后面的代码修改
(4)在lambda表达式不允许声明与全局变量相同的局部变量、参数
public static void main(String[] args) { Test test = new Test(); test.play(); int a=3; Fun fun2 = () -> System.out.println(a+5); fun2.say(); a=5;//编译会报错 }