匿名内部类和Lambda表达式有很多类似之处,首先都是在使用的时候才对接口进行实现,只是Lambda接口中只能由一个需要被实现的方法。
所有的Lambda表达式都可以 由匿名内部类改写:
interface Face1{ //无参数无返回值 public void face(); } interface Face2{ //有一个参数无返回值 public void face(int a); } interface Face3{ //有一个参数,有一个返回值 int face(int a); } interface Face4{ //有两个参数,有一个返回值 int face(int a,int b); } public class Test { public static void main (String[] args) throws java.lang.Exception { // 匿名内部类 实现接口 Face1 fn1=new Face1(){public void face(){System.out.println("匿名内部类 fn1");}}; fn1.face(); Face2 fn2=new Face2(){public void face(int a){System.out.println("匿名内部类 fn2 "+a);}}; fn2.face(10); Face3 fn3=new Face3(){public int face(int a){return a*a;}}; System.out.println("匿名内部类 fn3 :"+fn3.face(10)); Face4 fn4=new Face4(){public int face(int a,int b){return a+b;}}; System.out.println("匿名内部类 fn4 :"+fn4.face(10,9)); // Lambda表达式 实现接口 Face1 fl1=()->{System.out.println("Lambda表达式 fl1");}; fl1.face(); Face2 fl2=(a)->{System.out.println("Lambda表达式 fl2:"+a);}; fl2.face(10); Face3 fl3=(a)->{return a*a ;}; System.out.println("Lambda表达式 fl3:"+fl3.face(10)); Face4 fl4=(a,b)->a+b; System.out.println("Lambda表达式 fl4:"+fl4.face(10,9)); } }
运行结果:
匿名内部类 fn1
匿名内部类 fn2 10
匿名内部类 fn3 :100
匿名内部类 fn4 :19
Lambda表达式 fl1
Lambda表达式 fl2:10
Lambda表达式 fl3:100
Lambda表达式 fl4:19
Lambda表达式 在一定程度上是在匿名内部类的基础上进行代码简化(但是编译的方式不同):
Lambda的形式如: (参数)->{方法体}
1、当只有一个参数的时候可以把() 省略掉。
2、当方法体只有一条语句的时候 可以把 return关键词和{} 省略掉。