匿名内部类、Lambda表达式使用

本文探讨了匿名内部类如何在不创建接口实现类的情况下传递接口参数,以及Lambda表达式如何精炼接口实现。重点介绍了JDK8对局部变量的新规定和Lambda表达式的应用。

含义:匿名内部类就是一个没有名称的内部类,在调用包含接口类型参数的方法时,为了简化代码,不会创建一个接口的实现类作为方法参数传入,而是直接通过匿名类的方式传入一个接口类型参数,在匿名内部类中直接完成方法的实现。
例如:方法名(new 父类接口(){});
animalShout(new Animal({}));
调用animalShout()方法时,在方法的参数位置写上new Animal(){},这就相当于创建了一个实例对象,并将对象作为参数传给animalShout方法,在new Animal()后面有一个大括号,表示创建对象为Animal的子类实例,该子类是匿名的
(1)JDK8开始 允许内部类,匿名内部类中访问非final修饰的局部变量,而JDK之前,局部变量必须加final修饰符,否则会编译错误
2.Lambda表达式
含义:使用一个清晰简洁的表达式来表达接口,同时Lambda表达式也简化了对集合以及数组数据的遍历、过滤和提取。
只针对有一个抽象方法的接口实现,以简洁的方式来实现接口功能来作为方法参数
—>:用来指定参数数据的指向,不能省略,且必须用英文横线和大于书写

### 匿名内部类Lambda表达式的比较 #### 匿名内部类的特点 匿名内部类通常用于需要临时实现某个接口或继承某个类的情况,能够减少代码编写量。然而,这种方式可能会降低代码的可读性和维护性[^1]。 #### Lambda表达式的优点 自Java 8起引入的Lambda表达式提供了更为简洁的方法来表示匿名方法。相较于传统的匿名内部类Lambda表达式不仅简化了语法结构,还提高了代码的清晰度和易读性[^3]。具体来说: - **更少的模板代码**:不需要显式声明类或者方法签名。 - **增强的可读性**:通过去除冗余部分使得意图更加明显。 - **更好的性能表现**:JVM针对Lambda进行了优化,在某些情况下能带来更高的执行效率。 #### 转换规则 当满足特定条件时,可以从匿名内部类转换成Lambda表达式。主要适用于实现了单抽象方法(SAM, Single Abstract Method)类型的场合。例如Runnable接口只有一个`run()`方法,则可以直接用Lambda替代原来的匿名内部类形式[^4]。 ```java // 使用匿名内部类创建线程并启动 new Thread(new Runnable() { @Override public void run() { System.out.println("Thread using anonymous inner class"); } }).start(); // 使用Lambda表达式替换上述代码 new Thread(() -> System.out.println("Thread using lambda expression")).start(); ``` #### 应用场景对比 对于简单的回调函数、事件处理器或者其他只需要定义一次逻辑的地方,推荐优先考虑使用Lambda表达式;而对于复杂业务逻辑或是多态性的需求,则可能更适合采用传统方式即匿名内部类或其他面向对象的设计模式[^5]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值