1.Map操作符
作用:將被觀察者發(fā)送的事件轉(zhuǎn)換為任意類型的事件
例子:數(shù)據(jù)類型的轉(zhuǎn)換
/**
* map 操作符
* 事件轉(zhuǎn)換
* 將被觀察者發(fā)送的事件轉(zhuǎn)換為任意的類型事件暖途。
* 例子:數(shù)據(jù)類型轉(zhuǎn)換
*/
private void map() {
Observable.create(new ObservableOnSubscribe<Integer>() {
@Override
public void subscribe(ObservableEmitter<Integer> e) throws Exception {
e.onNext(111);
}
//使用map操作符進(jìn)行事件轉(zhuǎn)換
}).map(new Function<Integer, String>() {
@Override
public String apply(Integer integer) throws Exception {
return String.valueOf(integer) + "你好";
}
//被觀察者訂閱事件
}).subscribe(new Consumer<String>() {
@Override
public void accept(String s) throws Exception {
Log.e(TAG, "轉(zhuǎn)換結(jié)果: " + s);
}
});
}
輸出結(jié)果:
image.png
2.FlatMap操作符
作用:將被觀察者發(fā)送的多個(gè)事件進(jìn)行拆分,分別轉(zhuǎn)換為不同的事件
,然后合并成新的事件
例子:將每個(gè)Integer數(shù)據(jù)分別轉(zhuǎn)換成一個(gè)List贺辰,然后再迭代
/**
*FlatMap 操作符
* 將被觀察者的事件順序拆分
*
* 單獨(dú)轉(zhuǎn)換
* 在合并成新的事件
*
*/
private void flatMap(){
Observable.create(new ObservableOnSubscribe<Integer>() {
@Override
public void subscribe(ObservableEmitter<Integer> e) throws Exception {
e.onNext(1);
e.onNext(2);
e.onNext(3);
Log.e(TAG, "----- " );
}
}).flatMap(new Function<Integer, ObservableSource<String>>() {
@Override
public ObservableSource<String> apply(Integer integer) throws Exception {
List<String> list = new ArrayList<>();
//分別對(duì)被觀察者的事件進(jìn)行加工轉(zhuǎn)換i
for (int i = 0; i <2 ; i++) {
list.add("我是事件"+integer+"拆分后的子事件為"+i);
}
Log.e(TAG, "---------");
//拆分后合并
//
return Observable.fromIterable(list);
}
}).subscribe(new Consumer<String>() {
@Override
public void accept(String s) throws Exception {
Log.e(TAG, "accept: "+s );
}
});
}
輸出結(jié)果:
image.png
3.ConcatMap操作符
和FlatMap操作符原理一樣棚品,區(qū)別在于 FlatMap把事件拆分再合并的時(shí)候秧廉,順序可能和被觀察者發(fā)送的事件順序不一樣,而ConcatMap操作符處理后的事件順序和被觀察者發(fā)送事件的順序是一樣的。
/**
* 類似FlatMap()操作符
* 但是新事件循序還是和觀察者的順序一樣
*/
private void concatMap(){
Observable.create(new ObservableOnSubscribe<Integer>() {
@Override
public void subscribe(ObservableEmitter<Integer> e) throws Exception {
e.onNext(1);
e.onNext(2);
e.onNext(3);
e.onNext(4);
e.onNext(5);
e.onNext(6);
Log.e(TAG, "----- " );
}
}).concatMap(new Function<Integer, ObservableSource<String>>() {
@Override
public ObservableSource<String> apply(Integer integer) throws Exception {
List<String> list = new ArrayList<>();
for (int i = 0; i <2 ; i++) {
list.add("我是事件"+integer+"拆分后的子事件為"+i);
}
Log.e(TAG, "----- " );
return Observable.fromIterable(list);
}
}).subscribe(new Consumer<String>() {
@Override
public void accept(String s) throws Exception {
Log.e(TAG, "accept: "+s );
}
});
}
輸出結(jié)果:
image.png
4.Buffer操作符
把被觀察者的事件進(jìn)行緩存,然后每次從緩存中拿出一定數(shù)量事件發(fā)送給觀察者弛房。
/**
* buffer 操作符
* 定期從 被觀察者(Obervable)需要發(fā)送的事件中
* 獲取一定數(shù)量的事件 & 放到緩存區(qū)中狸臣,最終發(fā)送
* 緩存被觀察者的發(fā)送事件
*
*/
private void buffer(){
Observable.create(new ObservableOnSubscribe<Integer>() {
@Override
public void subscribe(ObservableEmitter<Integer> e) throws Exception {
e.onNext(1);
e.onNext(2);
e.onNext(3);
e.onNext(4);
}
}).buffer(2,1)//參數(shù)1:每次發(fā)送給觀察者事件的數(shù)量懂拾。參數(shù)2:每次從緩存中取出事件的數(shù)量
.subscribe(new Consumer<List<Integer>>() {
@Override
public void accept(List<Integer> i) throws Exception {
for (int j = 0; j <i.size() ; j++) {
Log.e(TAG, "accept: "+i.get(j) );
}
}
});
}
輸出結(jié)果
image.png