操作符
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操作符)**
参考自 慕课网
