ラムダ式は関数型インタフェースの匿名クラスと同様だが、若干違う部分もある。
その違いがthisの扱いになる。
通常の匿名クラスではthisは自分自身となるが、ラムダ式の場合thisはラムダ式を定義した外側のクラスのインスタンスになる。
次の例を考える。
public class LambdaTest {
@FunctionalInterface
interface Function {
void func();
}
public LambdaTest() {
Function func1 = new Function() {
@Override
public void func() {
System.out.println(Anon Class: + this.getClass());
}
};
Function func2 = () -> System.out.println(Lambda Exp.: + this.getClass());
func1.func();
func2.func();
}
public static void main(String... args) throws Exception {
new LambdaTest();
}
}
この結果は次のようになり、匿名クラスでは自分自身のクラス名が出力されるが、ラムダ式ではラムダ式を定義しているLambaTestクラスが出力される。
C:\lambda>java LambdaTest
Anon Class: class LambdaTest$1
Lambda Exp.: class LambdaTest