澄清lambda中的this关键字

时间:2018-06-28 15:24:13

标签: java reactive-programming

interface Observable<T> {
    Subscription subscribe(Observer<T> observer);


    default Observable<T> filter(Predicate<T> fn) {
        return observer -> {
            Observer<T> obsT = new Observer<T>() {
                @Override
                public void onNext(T t) {
                    if (fn.test(t))
                        observer.onNext(t);
                }

                @Override
                public void onError(Throwable t) {
                    observer.onError(t);
                }

                @Override
                public void onComplete() {
                    observer.onComplete();
                }
            };
            return this.subscribe(obsT);
        };
    }
}

this在上面的代码中指的是什么,有人可以帮忙...

2 个答案:

答案 0 :(得分:1)

它告诉当前的Observable对象实例在处理完Subscribe调用并返回新的Filter作为{{1 }}。

更具体地说,Subscription是指向正在执行当前作用域的对象实例的指针。

答案 1 :(得分:1)

行为在JLS §15.27.2中定义:

  

与出现在匿名类声明中的代码不同,lambda正文中出现的名称以及thissuper关键字的含义以及引用声明的可访问性与周围环境相同上下文(lambda参数引入新名称除外)。

用简单的英语来说,这意味着this引用了周围类型的当前实例。因此,在您的示例中,this引用了Observable<T>的当前实例。

这也意味着如果周围的方法是静态的,则不能使用this

import java.util.function.Supplier;

public class Sample {
  int x = 0;

  public static void main(String... args) {
    Supplier<String> function = () -> {
      return Integer.toString(this.x); // This is line 8
    };
  }
}

如果您尝试编译此代码,则编译器将产生以下错误:

Sample.java:8: error: non-static variable this cannot be referenced from a static context
      return Integer.toString(this.x);
                              ^
1 error

Ideone demo