首页 > 技术文章 > 匿名内部类和Lambda表达式实现有参有返回值抽象方法

kushulaoya 2021-03-13 19:05 原文

接口

package Demo4;

public interface Addable {
    int add(int x,int y);
}

测试类

package Demo4;

public class AddableDemo {
    public static void main(String[] args) {
        // 匿名内部类,创建接口对象,重载Addable接口add方法
        // 匿名内部类创建的类型可以是接口,也可以是抽象类,还可以是具体类
        useAddable(new Addable() {
            @Override
            public int add(int x, int y) {
                return x+y;
            }
        });
        // lambda表达式方法也是重载了方法,相比较于匿名内部类更简单清晰
        // 省略了方法名,省略了参数类型,接口名和函数名都一同省掉
        // 如果代码只有一行可再省略省略大括号和分号,
        // 如果有return,return也要省略掉
        useAddable((x,y)->x+y);
        // 为什可以省略因为javac的类型推断机制
        // 编译器能够根据上下文信息推断出参数的类型
    }
    private static void useAddable(Addable a){
        int sum = a.add(10,20);
        System.out.println(sum);
    }
}

注意:

  • 使用Lambda必须要有接口,并且要求接口中有且仅有一个抽象方法

  • 必须有上下文环境,才能推导出Lambda对应的接口

    • 根据局部变量的赋值得知Lambda对应的接口

      Runnable r = () -> System.out.println("Lambda表达式");

    • 根据调用方法的参数得知Lambda对应的接口

      new Thread(() -> System.out.println("Lambda表达式")).start();

推荐阅读