A working document描述 Project Lambda 的状态提到了所谓的 SAM(单一抽象方法)类型。据我所知,当前的 lambda 提案不会影响运行时,只会影响编译器,因为它可以实现从 lambda 表达式到这些类型的自动转换。
我认为在理想情况下,SAM 类型的实例可以在内部由函数指针表示。因此 JVM 可以避免为这些实例分配内存。
我想知道现代虚拟机是否能够提供这种优化。
最佳答案
@Tamás 您可能应该阅读 Brian Goetz 的邮件列表帖子:
http://mail.openjdk.java.net/pipermail/lambda-dev/2011-August/003877.html
基本上,lambda 抽象目前是使用对象实现的。但是,它被设计为允许 lambda 的替代实现,这将比类的实例“更小”。
您可以认为这种情况类似于自动装箱 - 整数被装箱为整数,但具有“更小”的表示形式(如整数)。
目前,lambda 必须装箱到 SAM 类型的实例,因为 JVM 目前无法用任何更小的构造来表示 lambda。将来,可能会有一个新的 JVM 标准,其中包括可以将 lambda 表示为对象以外的其他东西的“原始函数”。
因此,为了回答您的问题,您在上面提出的优化类型可能是可行的,但它可能会伴随 Java 8 之后的“原始函数”工作而不是特定于实现的功能。
关于Java - SAM类型优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7080479/