###操作符 Rxjava提供了对事件序列进行变换的支持;
- 变换:
核心功能;
就是将
事件序列中的(事件)对象或整个序列进行加工处理; 转换成不同的事件或者事件序列; - map操作符:就是用来把
一个事件转换为另一个事件的;
###下面结合实例代码分析map操作符
package com.example.jiajiemu.a11.rxjava;
import android.graphics.Bitmap;
import android.util.Log;
import rx...
public class RxjavaOperatorDemo {
private void map() {
Observable.just("map/image/map.png")
.map(new Func1<String, Bitmap>() {
@Override
public Bitmap call(String filePath) {
return getBitmap(filePath);
}
})
.subscribe(new Action1<Bitmap>() {
@Override
public void call(Bitmap bitmap) {
showBitmap(bitmap);
}
});
}
private void showBitmap(Bitmap bitmap) {
// TODO: 2017/10/7
}
private Bitmap getBitmap(String filePath) {
return null;
}
private Subscription processNetAddress() {
return Observable.just(
"http://www.baidu.com/",
"https://www.sina.com/",
"https://www.sohu.com/")
.flatMap(new Func1<String, Observable<String>>() {
@Override
public Observable<String> call(String s) {
return createObservable(s);
}
})
.subscribe(new Action1<String>() {
@Override
public void call(String s) {
}
});
}
private Observable<String> createObservable(String s) {
return null;
}
}
Observable.just("map/image/map.png")首先通过just()创建Observable(被观察者),参数是String类型,即图片的path;- 接着通过
链式调用map操作符进行相应的变换; 这里做的是String转到Bitmap的变换;
这里可见map中会传入一个Func1类(其参数是String、Bitmap两个), 注意Func1是Rxjava中的一个接口, 它用于包装含有参数的方法,
Observable.just("map/image/map.png")
.map(new Func1<String, Bitmap>() {
@Override
public Bitmap call(String filePath) {
return getBitmap(filePath);
}
})
-
这里注意
Func1中第一个参数——“String”, 就代表着**Observable 当前发出的类型, 即示例中当前发出的类型 String, 正对应着just()方法中传入的 String类型 的 图片path** -
而第二个参数
Bitmap, 即String类型**将要转换成的类型**;
小结: 通过
just方法传入String类型(也就是图片Path), 然后调用map操作符, 将String类型图片Path转换成Bitmap, 这就完成了map操作符的调用;
map操作符会创建一个新的Observable, 再链式调用subscribe(), 完成订阅关系; 这也是用Observable来调用subscribe()而不是用Observer来调用的原因; Rxjava可以通过不同种类的操作符来完成新的Observable的创建, 进而进行链式调用
- !!!
map()函数接受一个Func1类型的参数, 然后把这个Func1应用到每一个由Observable发射的值上, 将发射的值转换为我们期望的值;map()是Rxjava中操作符的最常见的一种使用;
###flatMap操作符
flatMap其实和map作用类似; 都是用于进行事件转换的;
下面是示例代码:
private Subscription processNetAddress() {
return Observable.just(
"http://www.baidu.com/",
"https://www.sina.com/",
"https://www.sohu.com/")
.flatMap(new Func1<String, Observable<String>>() {
@Override
public Observable<String> call(String s) {
return createObservable(s);
}
})
.subscribe(new Action1<String>() {
@Override
public void call(String s) {
}
});
}
-
以上是一个简单的场景, 首先通过
just()输入三个String类型的url地址, 返回一个网站url列表; -
调用
just()完成Observable的创建之后, 就调用flatMap操作符;
就示例而言,map与flatMap的区别在于,map将String转换成了Bitmap, 而flatMap将String转换成了Observable; 当然它们的共同点是, 它们都是**用来进行事件转换的;**
以上区别是理解flatMap的关键, 因为,flatMap转换得到的Observable, 正是.subscribe()需要用到的,.subscribe()会接收到just()中的那一连串的字符串, 来完成输出;
flatmap的原理, 就是将String类型转换成Observable, 然后给subscriber 观察者接收;
- 将
传入的事件对象转换成一个Observable对象;- 这是不会直接发送这个
Observable, 而是将这个Observable激活, 让它自己开始发送事件;- 每一个创建出来的Observable
发送的事件, 都会被汇入同一个Observable;![]()
map是会将事件一一对应,映射成一个新的事件,flatmap则会将所有的事件,转换成一个Observable, 然后由这个统一的Observable来进行事件的分发; (这其实也符合其英文命名的意义,flatmap——扁平化的map操作符)
参考自 慕课网