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

Gam*_*iac 5 lambda scala

标题可能有点令人困惑,所以让我详细说明,我一直在阅读一些关于Scala的批评.这是一封发送给Tyepsafe的电子邮件,内容是来自Coda Hale(Yammer的基础设施架构师)的 Scala的一些不足之处,所以引用:

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

所以,从这一点来看,我有几个关于lambda如何在Scala中工作的问题:

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

Kev*_*ght 4

是的,lambda 仍然是对象,匿名类的实例。

这就是 JVM 的工作原理,所有引用都是对象。您可以拥有引用或值(基元),并且没有办法绕过它。

Java 的更高版本有 MethodHandles。但值得注意的是,它MethodHandle仍然只是一个抽象类 - 尽管 JVM 明确知道如何在运行时进行优化。

另外值得注意的是,JVM 通常可以对抽象类(例如 Scala 的函数)执行逃逸分析,并对其进行优化。

除此之外,Scala 可以使用带有方法的任何apply对象,就好像它是Function. 在这种情况下,显式调用会apply在字节码中发出,并且您不再处理匿名类。

考虑到上述所有内容,不可能对 Scala 函数实现的性能做出一般性的陈述,这取决于您的具体代码/用例。一般来说,我不会担心,除非你遇到了一个极端的情况,你的分析器在这里指出了一个问题(这不太可能)