我一直在探索lambdas的概念,以及它们如何在实现功能接口时提供更简单的语法。
根据this article,如果有一个方法,那么实现lambda非常容易。所以,
interface OnClickListener {
public void onClick(View v);
}
可用于:
etDate.setOnClickListener(view -> Timber.i("the date is xyz"));
我已经看到这种方法同样适用于具有不同类型参数的方法的接口,例如:
public interface Observer<T> {
void onSubscribe(Disposable d);
void onNext(T t);
void onError(Throwable e);
void onComplete();
}
可用作
api.getData()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(response -> {
Toast.makeText(this, "Result: " + response.toString(), Toast.LENGTH_LONG).show();
}, error -> {
Toast.makeText(this, "API returned an error: " + error.getLocalizedMessage(), Toast.LENGTH_LONG).show();
});
所以我可以用onnext,然后是onerror。
但看看the DrawerListener interface:
我不能用逆转录酶。IDE不建议我将代码更改为lambda,我也不能这样使用它。我必须这样写…
drawer.addDrawerListener(new DrawerLayout.DrawerListener() {
@Override
public void onDrawerSlide(View drawerView, float slideOffset) {
// My action goes here
}
@Override
public void onDrawerOpened(View drawerView) {
}
@Override
public void onDrawerClosed(View drawerView) {
}
@Override
public void onDrawerStateChanged(int newState) {
}
});
……这可不干净。我希望能找到一个解决方案,写得像:
drawer.addDrawerListener(view, offset -> {
// My action goes here
});
最佳答案
lambdas只适用于只有一个抽象方法要实现的情况。对于drawerListener,有4种方法需要实现。这就是为什么你不能按照你想要的方式编码。如果您坚持使用lambdas,那么可以创建一个扩展drawerListener的接口,并为其中的方法提供默认实现。对于这个minsdk版本应该是24并且jack应该被启用。
interface CustomDrawerListener extends DrawerLayout.DrawerListener{
@Override
void onDrawerSlide(View drawerView, float slideOffset);
@Override
default public void onDrawerOpened(View drawerView) {
}
@Override
default public void onDrawerClosed(View drawerView) {
}
@Override
default public void onDrawerStateChanged(int newState) {
}
}
然后您可以编写add drawer listener,如下所示:
d1.addDrawerListener((CustomDrawerListener)(view,offset)->{
// My action goes here
});
build.gradle更改:
android {
defaultConfig {
minSdkVersion 24
//others
jackOptions {
enabled true
}
}
//other stuff
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
}