我正在尝试学习 Java Lambda。
我正在尝试将以下代码转换为 lambda 表示形式,但它不起作用:
private void foo(Data data) {
Observable.just(data).subscribeWith(new DisposableObserver<Data>() {
int count = 0;
int pageCount = 0;
@Override
public void onNext(Data data) {
Timber.e("onNext()");
count = data.getCount();
pageCount = data.getPage();
}
@Override
public void onError(Throwable e) {
e.printStackTrace();
}
@Override
public void onComplete() {
Log.e("class", "onComplete");
abc(count, pageCount);
}
});
}
private void bar(Data data) {
Observable.just(data).subscribeWith({
int count = 0;
int pageCount = 0;
data -> {
Timber.e("onNext()");
count = data.getCount();
pageCount = data.getPage();
},
e -> e.printStackTrace(),
() -> {
Log.e("class", "onComplete");
abc(count, pageCount);
}
});
}
这给了我错误。我不太确定如何修复它。
最佳答案
您错过了一个重要部分。您不能将任何匿名内部类实例化为 lambda。
引用自here :
The major benefit of java 8 functional interfaces is that we can use lambda expressions to instantiate them and avoid using bulky anonymous class implementation.
函数式接口(interface)的核心属性:它有一个单个抽象方法。
更多详情可查看here例如。
除此之外,我认为真正的答案是在元层面上:你必须了解你在做什么。意思是:你不使用这个或那个概念,因为你听说过它,并且有人说:“那太棒了”。您使用它是因为它在您的上下文中有意义。当然,只有当您理解这个概念时,您才能决定某件事是否有用、“正确的事情”。换句话说:真正的答案是(暂时)退一步;首先研究 lambda 的概念。然后决定在哪里使用它会给您的代码库带来好处。
最后:正如用户 Holger 在评论中所表达的那样 - 在该内部类中还有另一个禁忌;因为它包含字段;甚至被某些方法“共享”; 阻止将此类转换为单个纯 lambda 的另一个方面。
关于java - 无法将内部类转换为 Lambda,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43612748/