Lambda 表达式推演全过程

Java 的 Lambda 表达式推演过程:

第一步:正常的类实现(外部实现),new一个对象,然后重写方法实现

public class TestLambda3 {

    public static void main(String[] args) {
        Human human = new Man();
        human.run(1);
    }
}

//定义一个函数式接口
interface Human {
    void run(int a);
}

//外部实现类
class Man implements Human {
    @Override
    public void run(int a) {
        System.out.println("A man can run fast --> " + a);
    }
}

第二步:把类的实现放到内部,静态内部类

public class TestLambda3 {

    //实现类:静态内部类
    static class Man implements Human {
        @Override
        public void run(int a) {
            System.out.println("A man can run fast --> " + a);
        }
    }

    public static void main(String[] args) {
        Human human = new Man();
        human.run(2);
    }
}

//定义一个函数式接口
interface Human {
    void run(int a);
}

第三步:局部内部类

public class TestLambda3 {

    public static void main(String[] args) {

        //实现类:局部内部类
        class Man implements Human {
            @Override
            public void run(int a) {
                System.out.println("A man can run fast --> " + a);
            }
        }

        Human human = new Man();
        human.run(3);
    }
}

//定义一个函数式接口
interface Human {
    void run(int a);
}

第四步:匿名内部类,没有类的名称,必须借助接口或父类

public class TestLambda3 {

    public static void main(String[] args) {

        //实现类:匿名内部类
        Human man = new Human(){
            @Override
            public void run(int a) {
                System.out.println("A man can run fast --> " + a);
            }
        };

        man.run(4);
    }
}

//定义一个函数式接口
interface Human {
    void run(int a);
}

第五步:Lambda简化

public class TestLambda3 {

    public static void main(String[] args) {

        //Lambda简化
        Human man = (a) -> {
                System.out.println("A man can run fast --> " + a);
        };

        man.run(5);
    }
}

//定义一个函数式接口
interface Human {
    void run(int a);
}

第六步:Lambda 再简化成一行

public class TestLambda3 {

    public static void main(String[] args) {

        //Lambda简化
        Human man = a -> System.out.println("A man can run fast --> " + a);

        man.run(6);
    }
}

//定义一个函数式接口
interface Human {
    void run(int a);
}

总结:
1、 对于函数式接口,我们可以通过 Lambdaa 表达式来创建该接口的对象。
2、什么是函数式接口?任何接口,如果只包含唯一一个抽象方法,那么它就是一个函数式接口。
3、如果接口不是函数式接口,就不能用 Lambda 表达式来创建该接口的对象了。
4、Java 的 Runnable 接口就是函数式接口,该接口里面只有一个 run() 方法。
5、如果方法的执行体里面有多行,就不能做到第六步里面那样简化成一行,需要用第五步里的 {} 包裹代码段。

为什么要使用 Lambda 表达式?
1、避免匿名内部类定义过多
2、可以让你的代码看起来很简洁
3、去掉了ー堆没有意义的代码,只留下核心的逻辑。

原文地址:https://www.cnblogs.com/bigband/p/13544075.html