java - 澄清 lambda 中的 `this` 关键字
问题描述
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
,有人可以帮忙吗...
解决方案
该行为在JLS §15.27.2中定义:
与出现在匿名类声明中的代码不同,出现在 lambda 主体中的名称
this
和super
关键字的含义以及引用声明的可访问性与周围上下文中的相同(除了 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
推荐阅读
- kubernetes - 访问 Kubernetes 集群中 Zeppelin 的接口
- ios - 使用 for-in 后返回结构数组并应用 shuffled().sorted()
- winston - 为什么显示此“Papertrail 是传统的 winston 传输。考虑升级”
- c# - 是否可以创建一个单向的 IEqualityComparer?
- ios - 如何解决自动大小集合视图的问题?
- c++ - 如何修复 STM32F3 上 SPI 的片选时序?
- javascript - 从 React (Gatsby) 中的 GraphQL 查询导入 SVG
- c# - 无法从我想要的地方的锯齿状数组中获取值,但我在其他地方得到它
- python - 如何从python字典中找到特定节点到叶节点的所有路径以及前面的节点?
- c# - 在生产中的 Webform 报表主文件中找不到静态类