摘要:前两篇的使用一基本用法的使用二介绍了的基本用法,对还不了解的请先看以上两篇。这篇为大家讲解中和的使用。注意对这些发射的数据做的是合并操作,因此它们可能是交错的。如果要保证顺的的话,可以使用。其他操作符除了和之外,还有其他操作符以供使用。
前两篇Android RxJava的使用(一)基本用法、Android RxJava的使用(二)Action介绍了RxJava的基本用法,对Rxjava还不了解的请先看以上两篇。这篇为大家讲解RxJava中map和flatMap的使用。
参考:给 Android 开发者的 RxJava 详解回顾
(本文部分内容引用自该博客)
前两篇为大家介绍了使用RxJava打印多个字符串的方法
Observable.just("Hellow", "Wrold").subscribe(new Action1() { @Override public void call(String s) { Log.i(TAG, s); } });
这样的例子基本没有实际用处,只是为大家演示如何使用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 Func1flatMap() {//将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是一个比教难理解的一个转换,在这里先假设一个需求,需要打印多个Student所学的课程。这跟之前获取Student的name又不同了,这里先确定一下关系,一个Student类中只有一个name,而一个Student却有多门课程(Course),Student我们可以理解成这样:
/** * 学生类 */ class Student { private String name;//姓名 private ListcoursesList;//所修的课程 ... } /** * 课程类 */ class Course { private String name;//课程名 private String id; ... }
如果使用map来实现打印所有学生所修个课程名,实现的代码是这样的:
Liststudents = 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实现的代码是这样的:
Liststudents = 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()); } });
这样就实现了跟上面代码一样的效果,看起来有点懵?确实,flatMap理解起来有点绕,刚接触flatMap的时候我也是懵逼一个。下面我将flatMap的示意图,希望能帮助理解:
由上图可以看出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:跳过前几个元素
更多操作符
小结看完map、flatMap后,慢慢能看到RxJava的实际用处了。不过只是这点功能的RxJava是远远不能满足我们的需求,更多的用法我只能在后面更新了。今天就到这里吧!!!
以上有错误之处感谢指出
更多:
Android RxJava的使用(四)线程控制 —— Scheduler
参考:给 Android 开发者的 RxJava 详解
(本文部分内容引用自该博客)
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/73398.html
摘要:来总结一下我遇到的坑,或者说我为什么不在推荐使用。但是功利的看,在解决异步处理这个问题上,的确是投入高,收获少。这种在轻量级应用,或者一些小型异步处理比如数据埋点等等行为中,都显得过于庞大。距离上一次更新也有一段时间了,其实这篇文章我早就想写,碍于一直没来得及总结(懒)。所以一直没有成文。来总结一下我RxJava遇到的坑,或者说我为什么不在推荐使用RxJava。 相信熟悉或者关注我的朋友,绝...
摘要:中使用那一套,线程的速度,你知道的而对于分布式数据流来说,本来就是并行的,这种参数意义就不大了。函数种类一般作用在数据流上的函数,会分为两类。中的程序是实现在数据流上的。可以看作是的更新日志,数据流中的每一个记录对应数据库中的每一次更新。最近入职一个有趣的年轻同事,提交了大量大量的代码。翻开git记录一看,原来是用了非常多的java8的语法特性,重构了代码。用的最多的,就是map、flatM...
摘要:中使用那一套,线程的速度,你知道的而对于分布式数据流来说,本来就是并行的,这种参数意义就不大了。函数种类一般作用在数据流上的函数,会分为两类。中的程序是实现在数据流上的。可以看作是的更新日志,数据流中的每一个记录对应数据库中的每一次更新。最近入职一个有趣的年轻同事,提交了大量大量的代码。翻开git记录一看,原来是用了非常多的java8的语法特性,重构了代码。用的最多的,就是map、flatM...
摘要:中使用那一套,线程的速度,你知道的而对于分布式数据流来说,本来就是并行的,这种参数意义就不大了。函数种类一般作用在数据流上的函数,会分为两类。中的程序是实现在数据流上的。可以看作是的更新日志,数据流中的每一个记录对应数据库中的每一次更新。最近入职一个有趣的年轻同事,提交了大量大量的代码。翻开git记录一看,原来是用了非常多的java8的语法特性,重构了代码。用的最多的,就是map、flatM...
阅读 2980·2021-10-13 09:39
阅读 2680·2021-09-27 13:34
阅读 2016·2019-08-30 15:55
阅读 3230·2019-08-30 15:43
阅读 3602·2019-08-30 11:16
阅读 1724·2019-08-26 18:28
阅读 1081·2019-08-26 13:56
阅读 896·2019-08-26 13:35