• 08_Lambda表达式与匿名内部类的联系与区别


    【简述】

    Lambda表达式是匿名内部类的一种简化,因此它可以取代匿名内部类的作用。

    【Lambda表达式与匿名内部类的 相同点

    1.Lambda表达式和匿名内部类一样,都可以直接访问"effectively final"的局部变量,以及外部类的成员变量(包括实力变量和类变量)

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

    【相同点的实例】

    package com.Higgn.Lambda;
    
    @FunctionalInterface
    interface Displayable{
        public  void display();
        default int add(int a,int b){
            return a+b;
        }
    }
    class LambdaAndInner{
        private int age=10;
        private static String name="Higgin";
        public void test(){
            String book="《java编程思想》";
            Displayable dis=()->{
                //访问"effectively final"局部变量
                System.out.println("book局部变量为:"+book);
                //访问外部类的实力变量和类变量
                System.out.println("外部类的实例变量age:"+age);
                System.out.println("外部类的类变量name:"+name);
            };
            dis.display();
            //调用dis对象从接口中继承的add()方法
            System.out.println(dis.add(10, 20));
        }
    }
    public class TestDemo {
        public static void main(String[] args) {
            LambdaAndInner lai=new LambdaAndInner();
            lai.test();
        }
    }

    【运行结果】

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

    1.匿名内部类可以为任意接口创建实例——不管有多少个抽象方法,只要匿名内部类实现了所有方法即可。

    但是Lambda表达式只能为函数式接口创建实例。

    2.匿名内部类可以为抽象类甚至普通类创创建实例,

    但lambda表达式只能为函数式接口创建实例。

    3.匿名内部类实现的抽象方法体允许调用接口中的默认方法,

    但Lambda表达式的代码块不允许调用接口中的默认方法。

  • 相关阅读:
    使用Chrome断点调试javascript程序
    vue-iview-admin项目过大导致打包失败
    vue+iview后台管理系统util.ajax跨域问题的解决方法
    webpack vue热加载编译速度慢
    (转)网站架构变迁
    (转)工作不到一年,做出了100k系统,老板给我升职加薪
    (转)CPU说:这个世界慢!死!了!
    (转)一个故事搞懂“ERP“
    (转)手动搭建自己的nuget服务器及使用
    doc系统maven打包脚本
  • 原文地址:https://www.cnblogs.com/HigginCui/p/6122504.html
Copyright © 2020-2023  润新知