lambda在Scala中如何工作,它们是否在匿名类之上运行?

时间:2013-12-31 13:35:35

标签: scala lambda

标题可能有点令人困惑所以让我详细说明,我一直在阅读一些关于Scala的批评。这是一封发送给Tyepsafe的电子邮件,内容是Coda Hale (Yammer's Infrastructure Architect)中Scala的一些不足之处,所以要引用:

  

我们不再看到lambdas是免费的,并开始在匿名课程之上看到它们作为语法糖,因此我们就像匿名课程一样对它们产生了同样的厌恶。

因此,关于lambda在Scala中的工作方式,我有几个问题:

  • 自由函数和绑定到匿名类的函数有什么区别(技术上,并非所有函数都绑定到main单例对象)?
  • 使用匿名类绑定函数而不是自由函数对性能有何影响?

2 个答案:

答案 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会影响你的软件。