Поведение определено в 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