可读性
详细版本对于开发人员来说非常清楚Java
。它看起来几乎像 Java 中的匿名类。所以它可以用来解释 lambdas。这是详细版本的唯一优点。
REPL 支持
REPL 有一点点不同,但没什么用处:
scala> new Function2[Double, Double, Double] {
| def apply(t1: Double, t2: Double): Double = t1 + t2;
| }
res0: java.lang.Object with (Double, Double) => Double = <function2>
scala> val sum: (Double, Double) => Double = _ + _
sum: (Double, Double) => Double = <function2>
字节码大小
就jvm
trait 而言是一个 interface。当您创建基于 trait 的类时,编译器会通过从 trait 的伴随对象简单调用实现来生成方法。
FunctionN
最多两个参数的特征是specialized
onInt
和参数Long
,Double
结果类型参数另外专门用于Unit
和。这意味着您将获得 54 种附加方法(命名为)。Float
Boolean
Function2
apply
apply$mcZDD$sp
使用 lambda 版本,您正在使用 abstract class scala.runtime.AbstractFunction2
。所有方法都在这个类中生成。仅覆盖那些必要的。ClassName$anonfun$1.class
lambda( ) 的类文件大小为1012 字节。小于 1kB。
如果new Function2
所有方法都是在匿名类中生成的。匿名类 ( ClassName$anon$1.class
) 的类文件大小约为20 kB。
对于Function3
(不是专门的)差异不是那么大:1.1kB
vs 1.7kB
,但FunctionN
具有 0-2 个参数是最常见的 lambdas。没有AbstractFunctionN
字节码大小将是巨大的。