标题可能有点令人困惑所以让我详细说明,我一直在阅读一些关于Scala的批评。这是一封发送给Tyepsafe的电子邮件,内容是Coda Hale (Yammer's Infrastructure Architect)中Scala的一些不足之处,所以要引用:
我们不再看到lambdas是免费的,并开始在匿名课程之上看到它们作为语法糖,因此我们就像匿名课程一样对它们产生了同样的厌恶。
因此,关于lambda在Scala中的工作方式,我有几个问题:
main
单例对象)?答案 0 :(得分:4)
是的,lambdas仍然是对象,匿名类的实例。
这是JVM的工作方式,所有引用都是对象。你可以有引用或值(原语),但没有办法解决它。
Java的更高版本具有MethodHandles。但值得注意的是MethodHandle
也仍然只是一个抽象类 - 尽管JVM特别知道如何在运行时优化它。
另外值得注意的是,JVM通常可以对抽象类(例如Scala函数)执行转义分析,并对它们进行优化。
除此之外,Scala可以将任何对象与apply
方法一起使用,就好像它是Function
一样。在这种情况下,在字节码中发出对apply
的显式调用,而您不再处理匿名类。
鉴于上述所有内容,无法就Scala的功能实现的性能做出一般性陈述,这取决于您的特定代码/用例。一般情况下,我不担心,除非你碰到一个角落案例,你的探查器在这里指出了一个问题(非常不太可能)
答案 1 :(得分:1)
好吧,在C中,例如,一个函数只是一个32或64位指针,指向内存中要跳转到的位置,并且闭包的概念并不真正适用,因为您无法声明匿名c函数。我不知道C ++ lambdas是如何工作的,我想编译器会创建一个方法并在闭包中传递你想要的字段以及参数。也许这就是你要找的东西。在JVM中,您必须将逻辑包装在一个类中,这样您就拥有了一个方法,字段以及与同步和类型系统相关的一些方法的虚拟表。
对性能有何影响?...我不知道,您是否注意到对性能的影响?我所描述的很多额外的Java内容实际上并不需要匿名类,可能只是优化了。我想有些蝴蝶会影响天气,而不是额外的JVM会影响你的软件。