概述
RxJava2 的名气是越来越大,对应的在开发中使用的就越来越多,而日常开发中最长打交道的就是那些操作符(Operators),本文目的仅仅是为了记录map操作符的使用方法及场景,不会太多涉及Rxjava2本身的知识。如需详细学习,请移步官方网址:
操作符
首先应该明白操作符是用来干什么的,RxJava
以存在一个数据流的概念,从Observable发射数据,数据流经过操作符的处理,最后被Observer接收到,然后消费掉. 如下图所示
今天要将的map就是其中一个。
map 操作符
如何学习
其实官方文档已经非常贴心了,除了文字还有配图,然而就是这么详细的文档,我们在不熟悉的时候仍然是看不懂,而且会有抵触。不过我们应该克服内心的抵触,优先查看官方文档,例如通过官方文档的配图,我们基本上就可以大体明白map是干什么用的。
这个图如何看呢?
首先第一行代表的是Observeable发射的原始数据,假设我们发送的是一个整型数组,假设上图就代表[1,2,3,4,5,6],那么1是红圆,2是黄圆以此类推;中间表示操作符map的操作;第三行是经过中间操作符变换后的数据流。可以从图中看到,map的作用就是将一个圆变换为一个菱形,而且是对每一个元素进行变换。例如我们的map功能是把整型变为字符串,那么最终的数据就会变为[“1”,“2”,“3”,“4”,“5”,“6”].
map详解
官方解释:
Returns an Observable that applies a specified function to each item emitted by the source ObservableSource and emits the results of these function applications.
map会对原始Observable 发射的每个数据都应用一个用户定义的转换操作,然后返回一个Observable,这个Observable再发射数据时就是被map改变过的数据了。
例如我们对一个整型数组的每个元素都做一个变换,如下代码所示:
Observable.range(1,3)
.map(new Function<Integer, String>() {
@Override
public String apply(Integer integer) throws Exception {
return String.format("我从Integer %s 变成了String %s",integer,integer);
}
}).subscribeOn(Schedulers.computation())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Consumer<String>() {
@Override
public void accept(String s) throws Exception {
Log.d("Map",s);
}
});
输出结果为:
我从Integer 1 变成了String 1
我从Integer 2 变成了String 2
我从Integer 3 变成了String 3
可见,Observable发射的第一个元素通过我们自定义的变换函数变成了我从Integer 1 变成了String 1
,以此类推。
使用场景
map的使用场景非常普遍,只要数据源与我们最终需要的数据格式不一致的场景下都可以使用map变换。