Java 从匿名内部类到Lambda表达式

匿名内部类和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关键词和{} 省略掉。

原文地址:https://www.cnblogs.com/easyidea/p/14096094.html