在之前的一篇中,大致写了一些Rx的简单使用,如果兴趣的可以看下Rx学习笔记总结
这两天也在学习Rx,原本计划的挺多,但是被自己少之又少的知识储备和经验给浪费了大量的时间,以至于晚上两点多的时候也没有完整的解决错误。在这里也是刚了解过,可能准备的不是很充分,这里就简单的记下笔记,也算是对自己的这两天的一个总结。 ###过滤序列filter函数 RxJava让我们使用filter()方法来过滤我们观测序列中,不想要的值,比如,现在我的这个应用中,是获取到了所有手机安装应用的列表,那么我们这个时候只想要展示我们需要的应用的列表,比如展示以A开头的应用的列表,我们该怎么做呢,我们就可以使用filter()函数帮助我们。我们看下代码。(代码最清晰) 先看下效果图: ####没有过滤之前的效果图:
####过滤之后的效果图:
/**
* 过滤系列,我们可以利用filter()方法来过滤我们观测序列中不想要的值例如我们只想要开头是C的应用
* 我们可以filter(appInfo ->appInfo.getName().startsWith("C"))
* <p>
* 如果不使用lambda表达式,是这样写的
* filter(new Func1<AppInfo, Boolean>() {
*
* @param apps
* @Override public Boolean call(AppInfo appInfo) {
* return appInfo.getName().startsWith("C");
* }
* })
* 我们传入一个新的Func1对象给filter()函数,Func1有一个AppInfo对象来作为他的参数类型并且返回
* Boolean对象,只要条件符合filter()函数,就会返回true,此时,值会发出去并且所有的观察者都会接受到
*
* 当然我们也可以检测null
*/
private void loadList(List<AppInfo> apps) {
mRecyclerView.setVisibility(View.VISIBLE);
Observable.from(apps)
.filter(appInfo ->
appInfo.getName().startsWith("A"))
.subscribe(new Subscriber<AppInfo>() {
@Override
public void onCompleted() {
mSwipeRefreshLayout.setRefreshing(false);
}
@Override
public void onError(Throwable e) {
Toast.makeText(getActivity(), "Something is wrong", Toast.LENGTH_SHORT).show();
mSwipeRefreshLayout.setRefreshing(false);
}
@Override
public void onNext(AppInfo appInfo) {
mAppInfos.add(appInfo);
mAdapter.addData(mAppInfos.size() - 1, appInfo);
}
});
}
复制代码
是不是很好用呢,不急,还有更好的呢,我们是不是有的时候在请求数据回来,去判断数据是否null,如果不为空,我们在去设置数据,同样,我们可以使用filter()帮我们过滤null的数据
filter(appInfo1 -> appInfo1!=null) //lambda表达式
filter(new Func1<AppInfo, Boolean>() { //正常的写法
@Override
public Boolean call(AppInfo appInfo) {
return appInfo != null;
}
})
复制代码
看起来就一行代码(lambda表达式的写法),但是他帮助我们免去了在onNext()函数调用后再去检测null值。