Java 无法将内部类转换为Lambda
我正在努力学习Java Lamdas 我正在尝试将以下代码转换为lambda表示,但它不起作用:Java 无法将内部类转换为Lambda,java,lambda,java-8,inner-classes,Java,Lambda,Java 8,Inner Classes,我正在努力学习Java Lamdas 我正在尝试将以下代码转换为lambda表示,但它不起作用: private void foo(Data data) { Observable.just(data).subscribeWith(new DisposableObserver<Data>() { int count = 0; int pageCount = 0; @Override public void onN
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);
}
});
}
private void foo(数据){
可观察的.just(data).subscribowith(新的可处置的观察者(){
整数计数=0;
int pageCount=0;
@凌驾
公共void onNext(数据){
木材.e(“onNext()”);
count=data.getCount();
pageCount=data.getPage();
}
@凌驾
公共无效申报人(可丢弃的e){
e、 printStackTrace();
}
@凌驾
未完成的公共空间(){
Log.e(“类别”、“未完成”);
abc(计数,页面计数);
}
});
}
专用空心条(数据){
可观察的。只是(数据)。下标({
整数计数=0;
int pageCount=0;
数据->{
木材.e(“onNext()”);
count=data.getCount();
pageCount=data.getPage();
},
e->e.printStackTrace(),
() -> {
Log.e(“类别”、“未完成”);
abc(计数,页面计数);
}
});
}
这给了我错误。我真的不知道如何修复它。您遗漏了一个重要部分。您不能将任何匿名内部类实例化转换为lambda 引述自: Java8函数接口的主要好处是,我们可以使用lambda表达式来实例化它们,并避免使用庞大的匿名类实现 功能接口的核心属性是:它有一个单一的抽象方法 例如,可以找到更多细节 除此之外,我认为真正的答案在元层面上:你必须理解你在做什么。意思是:你不使用这个或那个概念,因为你听说过,有人说:“太好了”。你使用它是因为它在你的上下文中是有意义的 当然,你只能决定某些东西是否有用,“正确的东西”。。。当你理解了这个概念。换句话说:真正的答案是退一步(现在);首先研究lambdas的概念。然后决定在何处使用它将为您的代码库带来好处
最后:正如用户Holger在评论中所表达的,在这个内部类中还有一个禁忌;因为它包含字段;甚至被一些方法“共享”;阻止将该类转换为单个纯lambda的另一个方面。您遗漏了一个基本部分。您不能将任何匿名内部类实例化转换为lambda 引述自: Java8函数接口的主要好处是,我们可以使用lambda表达式来实例化它们,并避免使用庞大的匿名类实现 功能接口的核心属性是:它有一个单一的抽象方法 例如,可以找到更多细节 除此之外,我认为真正的答案在元层面上:你必须理解你在做什么。意思是:你不使用这个或那个概念,因为你听说过,有人说:“太好了”。你使用它是因为它在你的上下文中是有意义的 当然,你只能决定某些东西是否有用,“正确的东西”。。。当你理解了这个概念。换句话说:真正的答案是退一步(现在);首先研究lambdas的概念。然后决定在何处使用它将为您的代码库带来好处
最后:正如用户Holger在评论中所表达的,在这个内部类中还有一个禁忌;因为它包含字段;甚至被一些方法“共享”;阻止将此类转换为单个纯lambda的另一个方面。您能提供您得到的错误吗?subscribowith()是RxJava的一个方法。我只是删掉了其他代码,因为它与当前的问题不太相关。请提供一个实际符合要求的示例。您使用的是RxJava吗,顺便说一句,您的代码以一个点开始,我认为它不会执行。首先修复我已经更新了cdoeCan,您可以提供您得到的错误吗?subscribeWidth()是RxJava的一个方法。我只是删掉了其他代码,因为它与当前的问题不太相关。请提供一个实际符合要求的示例。您使用的是RxJava吗,顺便说一句,您的代码以一个点开始,我认为它不会执行。首先修复我已经更新了CDoE,我如何重构上面的代码来实现lambda表示法?@user2498079我认为你做不到。如果
subscribeWith
接受三个类作为参数,每个类都提供一个函数,那么您就可以@user2498079您认为您可以做什么?看看我对答案的更新。不仅是要实现的方法的数量,而且这个内部类声明字段的事实使得它没有资格将其转换为lambda表达式。我如何重构上面的代码以实现lambda表示法?@user2498079我想你不能。如果subscribeWith
接受三个类作为参数,每个类都提供一个函数,那么您就可以@user2498079您认为您可以做什么?请看我对答案的更新。不仅要实现的方法的数量,而且这个内部类声明字段的事实使得它没有资格将其转换为lambda表达式。