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