【发布时间】:2017-08-10 09:36:51
【问题描述】:
我一直在探索 lambda 的概念以及它们如何在实现函数式接口时提供更简单的语法。
根据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:
我无法使用 RetroLambda 来使用它。 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
});
【问题讨论】:
标签: java android lambda java-8 retrolambda