2024年4月8日发(作者:)
详解Java中的Lambda表达式
详解Java中的Lambda表达式
Java 8 开始出现,带来一个全新特性:使用 Lambda 表达式 (JSR-335) 进行函数式
编程。今天我们要讨论的是 Lambda 的其中一部分:虚拟扩展方法,也叫做公共辩护
(defender)方法。该特性可以让你在接口定义中提供方法的默认实现。例如你可以为已有
的接口(如 List 和 Map)声明一个方法定义,这样其他开发者就无需重新实现这些方法,
有点像抽象类,但实际却是接口。当然,Java 8 理论上还是兼容已有的库。
虚拟扩展方法为 Java 带来了多重继承的特性,尽管该团队声称与多重继承不同,虚
拟扩展方法被限制用于行为继承。或许通过这个特性你可以看到了多重继承的影子。但你
还是可以模拟实例状态的继承。我将在接下来的文章详细描述 Java 8 中通过 mixin 混入
实现状态的继承。
什么是混入 mixin?
混入是一种组合的抽象类,主要用于多继承上下文中为一个类添加多个服务,多重继
承将多个 mixin 组合成你的类。例如,如果你有一个类表示“马”,你可以实例化这个类
来创建一个“马”的实例,然后通过继承像“车库”和“花园”来扩展它,使用 Scala 的
写法就是:
val myHouse = new House with Garage with Garden
从 mixin 继承并不是一个特定的规范,这只是用来将各种功能添加到已有类的方法。
在 OOP 中,有了 mixin,你就有通过它来提升类的可读性。
例如在 Python 的 socketserver 模块中就有使用 mixin 的方法,在这里,mixin 帮
助 4 个基于不同 Socket 的 服务,包括支持多进程的 UDP 和 TCP 服务以及支持多线程的
UDP 和 TCP 服务。
class ForkingUDPServer(ForkingMixIn,
TCPServer):
UDPServer):
pass
passclass
class
passclass
ForkingTCPServer(ForkingMixIn,
ThreadingUDPServer(ThreadingMixIn, UDPServer):
ThreadingTCPServer(ThreadingMixIn, TCPServer): pass
什么是虚拟扩展方法?
Java 8 将引入虚拟扩展方法的概念,也叫 public defender method. 让我们姑且把
这个概念简化为 VEM。
VEM 旨在为 Java 接口提供默认的方法定义,你可以用它在已有的接口中添加新的方
法定义,例如 Java 里的集合 API。这样类似 Hibernate 这样的第三方库无需重复实现这
些集合 API 的所有方法,因为已经提供了一些默认方法。
下面是如何在接口中定义方法的示例:
public interface Collectionextends
Iterable{Collectionfilter(Predicatep) default { return (this, p); } }
Java 8 对混入的模拟
发布评论