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