当前位置 > it书童 > java > 正文

Lambda表达式与匿名内部类异同

java it书童 2020-11-29 12:15:29 0赞 0踩 198阅读 0评论

Lambda表达式虽然是匿名内部类的一种简化,但并不能完全替代匿名内部类,两者还是有所区别的。

先看下相似之处:

  • Lambda表达式与匿名内部类一样,都可以直接访问“effectively final”的局部变量,以及外部类的成员变量(包括实例变量和类变量)

  • Lambda表达式创建的对象与匿名内部类生成的对象一样,都可以直接调用从接口中继承的默认方法

@FunctionalInterface
interface Displayable {
    void display();
    default int add(int a, int b) {
        return a + b;
    }
}

public class LambdaAndInner {
    private int age = 22;
    private static String name = "降龙十八掌";
    public void test() {
        String book = "九阴真经";
        Displayable dis = () -> {
            // 访问 effectively final 的局部变量
            System.out.println("book 局部变量 " + book);
            System.out.println("外部类的实例变量 age " + age);
            System.out.println("外部类的类变量 name " + name);
        };
        dis.display();
        // 调用 dis 对象从接口中继承的默认方法
        System.out.println(dis.add(3, 5));
    }

    public static void main(String[] args) {
        LambdaAndInner lambdaAndInner = new LambdaAndInner();
        lambdaAndInner.test();
    }
}

源码 javaDemo 85a0ac6

区别之处:

  • 匿名内部类可以为任意接口创建实例—不管接口包含多少个抽象方法,只要匿名内部类实现所有的抽象方法即可;但Lambda表达式只能为函数式接口创建实例

  • 匿名内部类可以为抽象类甚至普通类创建实例;但Lambda表达式只能为函数式接口创建实例

  • 匿名内部类实现的抽象方法的方法体允许调用接口中定义的默认方法;但Lambda表达式的代码块不允许调用接口中定义的默认方法

关于我
一个文科出身的程序员,追求做个有趣的人,传播有价值的知识,微信公众号主要分享读书思考心得,不会有代码类文章,非程序员的同学请放心订阅
转载须注明出处:https://www.itshutong.com/articles/910