単一のメソッド クラスを関数ポインターに変換するのは難しいことではありませんが、1 つ欠けていることがあります。ラムダ式は単なる関数ではなく、クロージャーです。違いは、クロージャが外部変数をキャプチャできることです。疑似 Java での次の例を検討してください。
public Adder makeAdder(double startNumber) {
return #{ int number -> number + startNumber}
}
...
int startNumber = 5;
Adder add5 = makeAdder(startNumber);
add5.invoke(4); // ==> 9
この例では、makeAdder() の呼び出しによって生成されるラムダ関数は、このラムダの外部で定義された変数を参照します。それが「クロージャー」と呼ばれる理由です。それらは、自由変数 (この場合は startNumber) に対して「閉じられています」。このような状況を処理するには、クロージャーは関数へのポインターとその環境へのポインターの両方を保持する必要があります。したがって、メソッドと少なくとも 1 つの変数を持つデータ構造が得られます。しかし、それは OOP でのオブジェクトの定義ではありませんか? では、匿名クラスのインスタンスにできるのであれば、新しい種類のオブジェクトを作成する理由は何ですか?
それでも、そのような匿名クラスに対して他の最適化が行われる場合があります。あなたが指摘した作業文書では、それらのいくつかについて言及しています。たとえば、最終的な変数を効果的に推論して使用しています(ただし、これは主に、コードを最適化するためではなく、原則として JVM でラムダを許可するために行われます)。生成された匿名クラスも最終的に実行される可能性があり、ほとんどの JVM は既に最終的な変数とクラスに対して優れた最適化を行っています。
その他の改善は、環境への参照にも関係する可能性があります。そこにはたくさんのオプションがあります。