Android编程开发Rxjava使用技巧
android开发rxjava使用技巧。
map
在使用map之前要先说道一个接口:func1,func1和上一篇提到的action1相似。func1 和 action的区别在于, func1 包装的是有返回值的方法。 接下来就是map的用法,看代码更直观点; 例:得到多个student对象中的name,保存到namelist中
observable.just(student1, student2, student2) //使用map进行转换,参数1:转换前的类型,参数2:转换后的类型 .map(new func1() { @override public string call(student i) { string name = i.getname();//获取student对象中的name return name;//返回name } }) .subscribe(new action1() { @override public void call(string s) { namelist.add(s); } });
可以看到observable中原来的参数是student对象,而最后我们需要的是name,这里使用了map来实现这一转换的过程。当然,map可以多次使用。
//多次使用map,想用几个用几个 observable.just("hello", "world") .map(new func1() {//将string类型的转化为integer类型的哈希码 @override public integer call(string s) { return s.hashcode(); } }) .map(new func1() {//将转化后得到的integer类型的哈希码再转化为string类型 @override public string call(integer integer) { return integer.intvalue() + ""; } }) .subscribe(new action1() { @override public void call(string s) { log.i(tag, s); } });
flatmap
flatmap是一个比教难理解的一个转换,在这里先假设一个需求,需要打印多个student所学的课程。这跟之前获取student的name又不同了,这里先确定一下关系,一个student类中只有一个name,而一个student却有多门课程(course),student我们可以理解成这样:
/** * 学生类 */ class student { private string name;//姓名 private list courseslist;//所修的课程 ... } /** * 课程类 */ class course { private string name;//课程名 private string id; ... }
如果使用map来实现打印所有学生所修个课程名,实现的代码是这样的:
list students = new arraylist(); students.add... ... action1> action1 = new action1>() { @override public void call(list courses) { //遍历courses,输出cuouses的name for (int i = 0; i < courses.size(); i++){ log.i(tag, courses.get(i).getname()); } } }; observable.from(students) .map(new func1>() { @override public list call(student student) { //返回courseslist return student.getcourseslist(); } }) .subscribe(action1);
可以看到,在action1中出现了for来循环打印课程名,使用rxjava就是为了剔除这样的嵌套结构,使得整体的逻辑性更强。这时候就可以使用flatmap了,使用flatmap实现的代码是这样的:
list students = new arraylist(); students.add... ... observable.from(students) .flatmap(new func1>() { @override public observable call(student student) { return observable.from(student.getcourseslist()); } }) .subscribe(new action1() { @override public void call(course course) { log.i(tag, course.getname()); } });
可以看出student1、student2经过flatmap后,按顺序依次经历了observable1、observable2,分别转化为course。最后按顺序得到course1、course2、course3、course4、course5、course6,其中1-3由student1得到,4-6由student2得到。
结合代码和示意图,是不是对flatmap有了一定的理解。
注意:flatmap对这些observables发射的数据做的是合并(merge)操作,因此它们可能是交错的。也就说,传入的顺序可能跟出来的顺序不一样。
如果要保证顺的的话,可以使用concatmap。
其他操作符
除了map和flatmap之外,还有其他操作符以供使用。这里就不一一列举他们的用法了,其他常用的操作符如下:
filter:集合进行过滤
each:遍历集合
take:取出集合中的前几个
skip:跳过前几个元素
推荐阅读
-
android开发教程之switch控件使用示例
-
【前端开发环境】前端使用GIT管理代码仓库需要掌握的几个必备技巧和知识点总结
-
Python的网络编程库Gevent的安装及使用技巧
-
Android开发之使用ExifInterface获取拍照后的图片属性
-
Android编程实现使用SoundPool播放音乐的方法
-
Android开发教程之shape和selector的结合使用
-
Android编程实现使用webView打开本地html文件的方法
-
android使用RxJava实现预加载
-
android非RxJava环境下使用Handler实现预加载
-
Android编程开发之EditText中inputType属性小结