可読性
詳細バージョンは、開発者にとって非常に明確ですJava
。これは、Java の無名クラスのように見えます。したがって、ラムダの説明に使用できます。これが冗長バージョンの唯一の利点です。
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
は、インターフェースです。トレイト コンパイラに基づいてクラスを作成すると、トレイトのコンパニオン オブジェクトからの実装の単純な呼び出しでメソッドが生成されます。
FunctionN
最大 2 つのパラメーターがspecialized
on Int
、Long
およびDouble
パラメーターである特性、結果の型パラメーターはさらに on Unit
、Float
およびに特化されていBoolean
ます。これは、54 個の追加メソッド ( のような名前) を取得することを意味しFunction2
ます。apply
apply$mcZDD$sp
ラムダ バージョンでは、抽象クラスを使用していますscala.runtime.AbstractFunction2
。すべてのメソッドは、このクラスで生成されます。必要なものだけをオーバーライドします。ClassName$anonfun$1.class
lambda( )のクラスファイルのサイズは1012 バイトです。1kB未満。
new Function2
すべてのメソッドが匿名クラスで生成される場合。匿名クラス ( ClassName$anon$1.class
) のクラス ファイル サイズは約20 kBです。
for Function3
(特殊化されていない) の違いはそれほど大きくありません: 1.1kB
vs1.7kB
ですがFunctionN
、引数が 0 ~ 2 のものが最も一般的なラムダです。AbstractFunctionN
バイトコードがなければサイズが巨大になります。