如何在Lambda表达式中使用this和super关键字?代码举例讲解

在 Lambda 表达式中,this 和 super 关键字的行为有些不同于普通的 Java 代码。

  1. this 关键字
  • 在 Lambda 表达式中,this 关键字对应的是 Lambda 表达式所在的函数式接口类型实例。
    例如:
public class Foo {
    public void doSomething() { ... }
}

Foo f = new Foo();
Consumer<Foo> c = (Foo x) -> x.doSomething();
c.accept(f);

这里的 this 是 Consumer 类型的实例,即 c 变量。

  • 如果 Lambda 表达式是声明在某个类的方法中,this 会默认对应该方法的接收者。
    例如:
public class Bar {
    public void doSomething() {  
        Consumer<Foo> c = (Foo x) -> x.doSomething();
        c.accept(new Foo());
    }
} 

这里的 this 是 Bar 类的对象,因为 Lambda 表达式在 Bar 类的 doSomething() 方法中声明。

  • 如果明确需要访问包围类,可以使用包围类的名称加 this 关键字。
    例如:
public class Bar {
    public void doSomething() {
        ...
    }  

    public void method() {
        Consumer<Bar> c = (Bar x) -> x.doSomething(); 
        c.accept(Bar.this); 
    }
}

这里 Bar.this 表示 Bar 类的接收者对象。

  1. super 关键字
  • 在 Lambda 表达式中,super 关键字对应的是函数式接口类型的超类型中的方法。
    例如:
interface Foo {
    void doSomething(); 
}

interface Bar extends Foo {
    void doAnotherThing();
}

Bar b = () -> {
    super.doSomething(); // 调用 Foo 接口的 doSomething() 方法
};

这里 super.doSomething() 调用超接口 Foo 的 doSomething() 方法。