Transforming Observables(转换Observable)
1、Map
对Observable发射的每一项数据应用一个函数,执行变换操作
//将Integer类型转换为String类型
Observable.just(123).map(new Func1<Integer, String>() {
@Override
public String call(Integer integer) {
System.out.println("call():" + integer);
return integer + "";
}
}).subscribe(new Subscriber<String>() {
@Override
public void onCompleted() {
System.out.println("onCompleted()");
}
@Override
public void onError(Throwable throwable) {
System.out.println("onError():" + throwable.getMessage());
}
@Override
public void onNext(String s) {
System.out.println("onNext():" + s);
}
});
运行结果:
call():123
onNext():123
onCompleted()
2、FlatMap
FlatMap 将一个发射数据的Observable变换为多个Observables,然后将它们发射的数据合并 后放进一个单独的Observable
FlatMap 操作符使用一个指定的函数对原始Observable发射的每一项数据执行变换操作,这 个函数返回一个本身也发射数据的Observable,然后FlatMap 合并这些Observables发射的数 据,最后将合并后的结果当做它自己的数据序列发射。
Observable.just(1, 2, 3, 4, 5, 6).flatMap(new Func1<Integer, Observable<? extends String>>() {
@Override
public Observable<? extends String> call(Integer integer) {
System.out.println("Observable():" + integer);
//return null;
return Observable.just(integer + "");
}
}).subscribe(new Subscriber<String>() {
@Override
public void onCompleted() {
System.out.println("onCompleted()");
}
@Override
public void onError(Throwable throwable) {
System.out.println("onError():" + throwable.getMessage());
}
@Override
public void onNext(String s) {
System.out.println("onNext():" + s);
}
});
运行结果:
Observable():1
onNext():1
Observable():2
onNext():2
Observable():3
onNext():3
Observable():4
onNext():4
Observable():5
onNext():5
Observable():6
onNext():6
onCompleted()
3、GroupBy
//将一个Observable分拆为一些Observables集合,它们中的每一个发射原始Observable的一个 子序列, //哪个数据项由哪一个Observable发射是由一个函数判定 的,这个函数给每一项指定一个Key, //Key相同的数据会被同一个Observable发射.
Observable.range(1, 8).groupBy(new Func1<Integer, String>() {
@Override
public String call(Integer integer) {
return (integer % 2 == 0) ? "偶数组" : "奇数组";
}
}).subscribe(new Action1<GroupedObservable<String, Integer>>() {
@Override
public void call(final GroupedObservable<String, Integer> stringIntegerGroupedObservable) {
String key = stringIntegerGroupedObservable.getKey();
System.out.println("group name:" + key);
if (key.equalsIgnoreCase("奇数组")) {
stringIntegerGroupedObservable.subscribe(new Action1<Integer>() {
@Override
public void call(Integer integer) {
System.out.println(key + "'member: " + integer);
}
});
} else if (key.equalsIgnoreCase("偶数组")) {
stringIntegerGroupedObservable.subscribe(new Action1<Integer>() {
@Override
public void call(Integer integer) {
System.out.println(key + "'member: " + integer);
}
});
}
}
});
运行结果:
group name:奇数组
奇数组'member: 1
group name:偶数组
偶数组'member: 2
奇数组'member: 3
偶数组'member: 4
奇数组'member: 5
偶数组'member: 6
奇数组'member: 7
偶数组'member: 8
4、Buffer
定期收集Observable的数据放进一个数据包裹,然后发射这些数据包裹,而不是一次发射一 个值。
Buffer 操作符将一个Observable变换为另一个,原来的Observable正常发射数据,变换产生 的Observable发射这些数据的缓存集合。
Buffer 操作符在很多语言特定的实现中有很多种变体,它们在如何缓存这个问题上存在区别。
注意:如果原来的Observable发射了一个 onError通知, Buffer会立即传递这个通知,而不 是首先发射缓存的数据,即使在这之前缓存中包含了原始Observable发射的数据。
Observable.range(1, 10).buffer(3).subscribe(new Observer<List<Integer>>() {
@Override
public void onNext(List<Integer> number) {
System.out.println("onNext() ------>>>> " + number);
}
@Override
public void onCompleted() {
System.out.println("Complete!");
}
@Override
public void onError(Throwable e) {
System.out.println("onError!");
}
});
运行结果:
onNext() ------>>>> [1, 2, 3]
onNext() ------>>>> [4, 5, 6]
onNext() ------>>>> [7, 8, 9]
onNext() ------>>>> [10]
Complete!
5、Scan
连续地对数据序列的每一项应用一个函数,然后连续发射结果
//连续地对数据序列的每一项应用一个函数,然后连续发射结果
Observable.range(1, 10).scan(new Func2<Integer, Integer, Integer>() {
@Override
public Integer call(Integer integer, Integer integer2) {
return integer + integer2;
}
}).subscribe(new Action1<Integer>() {
@Override
public void call(Integer integer) {
System.out.println(integer + "");
}
});
运行结果:
1
3
6
10
15
21
28
36
45
55
这里首先1 第二项是前面输出的1再加上2,第三项是前面的1+2再加上3.....
6、Window
定期将来自原始Observable的数据分解为一个Observable窗口,发射这些窗口,而不是每次 发射一项数据
Window 和 Buffer 类似,但不是发射来自原始Observable的数据包,它发射的是 Observables,这些Observables中的每一个都发射原始Observable数据的一个子集,最后发 射一个 onCompleted 通知。
Observable.range(1, 10).window(3).subscribe(new Action1<Observable<Integer>>() {
@Override
public void call(final Observable<Integer> obser) {
obser.subscribe(new Action1<Integer>() {
@Override
public void call(Integer integer) {
System.out.println(integer + " of window " + obser);
}
});
}
});
运行结果:
1 of window rx.subjects.UnicastSubject@421faab1
2 of window rx.subjects.UnicastSubject@421faab1
3 of window rx.subjects.UnicastSubject@421faab1
4 of window rx.subjects.UnicastSubject@25f38edc
5 of window rx.subjects.UnicastSubject@25f38edc
6 of window rx.subjects.UnicastSubject@25f38edc
7 of window rx.subjects.UnicastSubject@1a86f2f1
8 of window rx.subjects.UnicastSubject@1a86f2f1
9 of window rx.subjects.UnicastSubject@1a86f2f1
10 of window rx.subjects.UnicastSubject@3eb07fd3