Разъяснение по ключевому слову this в лямбде - PullRequest
0 голосов
/ 28 июня 2018
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 голосов
/ 28 июня 2018

Поведение определено в JLS §15.27.2 :

В отличие от кода, появляющегося в объявлениях анонимного класса, значение имен и ключевых слов this и super, появляющихся в лямбда-теле, наряду с доступностью ссылочных объявлений, являются такими же, как в окружающем контексте (за исключением того, что лямбда-параметры вводят новые имена).

В простом английском это означает, что 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

0 голосов
/ 28 июня 2018

Указывает текущему экземпляру объекта Observable на вызов собственного метода Subscribe после завершения обработки вызова Filter и возврата нового Subscription как Observable.

В частности, this - это указатель на экземпляр объекта, который выполняет текущую область.

...