Lambda表达式和匿名内部类的区别

1、所需类型不同

  • 匿名内部类:可以是接口,也可以是抽象类,还可以是具体类
  • Lambda表达式:只能是接口

2、使用限制不同

  • 如果接口中有且仅有一个抽象方法,可以使用Lambda表达式,也可以使用匿名内部类
  • 如果接口中多于一个抽象方法,只能使用匿名内部类,而不能使用Lambda表达式

3、实现原理不同

  • 匿名内部类:编译之后,产生一个单独的.class字节码文件
  • Lambda表达式:编译之后,没有一个单独的.class字节码文件。对应的字节码会在运行的时候动态生成
package com.lambda;

public class LambdaDemo {

    public static void main(String[] args) {

        useStudent(new Student() {
            @Override
            public void study() {
                System.out.println("具体类");//具体类
            }
        });

        useAnimal(new Animal() {
            @Override
            public void method() {
                System.out.println("抽象类");//抽象类
            }
        });

        useInter(() -> System.out.println("接口"));//接口

    }

    //使用实体类作为方法的形参
    public static void useStudent(Student s) {
        s.study();
    }

    //使用抽象类作为方法的形参
    public static void useAnimal(Animal a) {
        a.method();
    }

    //使用接口作为方法的形参
    public static void useInter(Inter i) {
        i.show();
    }

}

interface Inter {
    void show();
}

abstract class Animal {

    public abstract void method();
}

class Student {
    public void study() {
        System.out.println("爱生活,爱Java");
    }
}

你可能感兴趣的:(#,Lambda表达式,java,开发语言,Lambda)