RxJava操作符总结之变换
map()
将发射序列的元素转化成另一种元素进行转换。
我们可能会有这种需求,有一个数组存放图片的地址,我们需要加载到图片并设置到对应的imageView
,那么,对于发射的元素,有这样一层转化,url
- >Bitmap
, 那么此时就是用到map()
请暂时忽略线程的问题,只是为了说明问题
Observable.from(urls)
.map(new Func1<String, Bitmap>() {
@Override
public Bitmap call(String url) {
return loadBitmap(url);
}
})
.subscribe(new Action1<Bitmap>() {
@Override
public void call(Bitmap bitmap) {
//设置图片
}
});
此代码的逻辑,我们通过from()
加载urls数组。通过map()
将url转化为Bitmap
,最后订阅的时候,设置图片即可。
flatMap()
将发射序列中的元素转化为另一个发射序列,最后将所有的发射序列合并成一条发射序列之后重新发送。
flatMap()
是将一个元素转化为一个发射序列。 一个元素转化成多个元素。同时,由于其发送的是一个Observable对象,相当于是另一个订阅响应的关系。map()
是将一个元素转化为另一个元素。一个元素转化成另一个元素。同步的直接返回值。
对于上一个例子,我们看到,将图片加载成Bitmap
对象,是同步的,但在实际情况中,我们肯定是在异步加载我们的图片,当图片完成之后,我们来通知相应的事件。那么,也即是一个Observable对象
Observable.from(urls)
.flatMap(new Func1<String, Observable<Bitmap>>() {
@Override
public Observable<Bitmap> call(String url) {
//返回Observable对象
return loadAsyncBitmap(url) ;
}
})
.subscribe(new Action1<Bitmap>() {
@Override
public void call(Bitmap bitmap) {
//获取到加载的图片
}
});
以上是从逻辑上分析,但从代码角度,我个人认为是因为他们处理的方式不同。因为如果我们直接使用map()
时,返回的对像,直接向下发送即可。而对于flatMap()
,返回的Observable
对象,我们知道其实质是一个携带回调信息的对象,我们不能直接继续发送,而是让其返回值与之前的值绑定。如果有疑惑的,可以看我之前的博客 RxJava前奏之原理分析。相信会有助于理解
上面那个例子是针对flatMap()
的一个特性,我们通过flatMap()
返回的是一个Observable
对象,我们知道其实质可以包含一个发射序列,只不过我们上一个例子的发射序列中只有一个元素,下面表示一个元素转化为一个发射序列。
public static void main(String[]