android java map_【Android】RxJava的使用(三)转换——map、flatMap

前两篇Android RxJava的使用(一)基本用法、Android RxJava的使用(二)Action介绍了RxJava的基本用法,对Rxjava还不了解的请先看以上两篇。这篇为大家讲解RxJava中map和flatMap的使用。

回顾

前两篇为大家介绍了使用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 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());

}

});

这样就实现了跟上面代码一样的效果,看起来有点懵?确实,flatMap理解起来有点绕,刚接触flatMap的时候我也是懵逼一个。下面我将flatMap的示意图,希望能帮助理解:

52cd2d514528

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是远远不能满足我们的需求,更多的用法我只能在后面更新了。今天就到这里吧!!!

以上有错误之处感谢指出

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值