RxJava

1. 变换

  • map()

    它是一对一的

1
2
3
4
5
6
7
8
9
10
11
12
Observable.just("image/logo.png")//输入类型String,图片地址
.map(new Func1<String, Bitmap>() {
@Override
public Bitmap call(String filePath) {
return getBitmap(filePath);//转换为bitmap
}
}).subscribe(new Action1<Bitmap>() {
@Override
public void call(Bitmap bitmap) {
showBitmap(bitmap);//显示bitmap
}
});
  • flatMap()

    多对多转换

假如有这样一个场景,我们需要打印每个学生所修的课程,学生是一个集合,课程也是一个集合,如果按照map() 的做法如下:

这里我选用我项目里随意一个bean 对象,意思不变

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
UserInfo[] userInfos = new UserInfo[3];
Observable.from(userInfos)
.map(new Func1<UserInfo, List<AppInfo>>() {
@Override
public List<AppInfo> call(UserInfo userInfo) {
return userInfo.getAppInfos();
}
}).subscribe(new Action1<List<AppInfo>>() {

@Override
public void call(List<AppInfo> appInfos) {
for(AppInfo info : appInfos){
Log.i("xx",info.getAppName());
}
}
});

有种情况就是假如我不想要循环遍历呢,而是直接拿到 AppInfo 对象,显然 map() 是无法实现的,map() 我们前面也说过是 一对一的转换,而现在是一对多,那此时就应该用 flatMap().

使用flatMap() 的话,如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
Observable.from(userInfos)
.flatMap(new Func1<UserInfo, Observable<AppInfo>>() {
@Override
public Observable<AppInfo> call(UserInfo userInfo) {
return Observable.from(userInfo.getAppInfos());
}
}).subscribe(new Subscriber<AppInfo>() {
@Override
public void onCompleted() {

}

@Override
public void onError(Throwable e) {

}

@Override
public void onNext(AppInfo appInfo) {
Log.i("xx","appInfo.name::"+appInfo.getAppName());
}
});

上述是用 flatMap() 编写的,去除了 for 循环,flatMap()map() 有一个相同点:它们都是把传入的参数转化之后返回另一个对象。但需要注意的是,和map() 不同的是,flatMap() 中返回的是 Observable 对象。

flatMap() 原理如下:

  • 使用传入的事件对象创建一个 Observable 对象;
  • 并不发送这个 Observable 对象,而是将它激活,于是它开始发送事件;
  • 每一个创建出来的 Observable 发送的事件,都被汇入同一个 Observable,而这个 Observale 负责将这些事件统一交给 Subscriber 的回调方法。
-------------本文结束感谢您的阅读-------------