Android RxJava操作符詳解系列: 變換操作符

來源:互聯網
上載者:User

標籤:觀察者   使用   詳解   atm   3.4   需求   對象   統一   轉換   

Rxjava,由於其基於事件流的鏈式調用、邏輯簡潔 & 使用簡單的特點,深受各大 Android開發人員的歡迎。
Github

如果還不瞭解 RxJava,請看文章:Android:這是一篇 清晰 & 易懂的Rxjava 入門教程

RxJava如此受歡迎的原因,在於其提供了豐富 & 功能強大的操作符,幾乎能完成所有的功能需求
今天,我將為大家詳細介紹RxJava操作符中最常用的變換操作符,並附帶 Retrofit 結合 RxJava的執行個體Demo教學,希望你們會喜歡。
本系列文章主要基於 Rxjava 2.0
接下來的時間,我將持續推出 Android中 Rxjava 2.0 的一系列文章,包括原理、操作符、應用情境、背壓等等 ,有興趣可以繼續關注Carson_Ho的安卓開發筆記!!


目錄

1. 作用

對事件序列中的事件 / 整個事件序列 進行加工處理(即變換),使得其轉變成不同的事件 / 整個事件序列
具體原理如下

2. 類型

RxJava中常見的變換操作符如下:

下面,我將對每種操作符進行詳細介紹

註:本文只講解RxJava2在開發過程中常用的變換操作符
3. 應用情境 & 對應操作符 介紹

下面,我將對 RxJava2 中的變換操作符進行逐個講解
註:在使用RxJava 2操作符前,記得在項目的Gradle中添加依賴:
dependencies {
compile ‘io.reactivex.rxjava2:rxandroid:2.0.1‘
compile ‘io.reactivex.rxjava2:rxjava:2.0.7‘
// 註:RxJava2 與 RxJava1 不能共存,即依賴不能同時存在
}
1
2
3
4
5
3.1 Map()

作用
對 被觀察者發送的每1個事件都通過 指定的函數 處理,從而變換成另外一種事件

即, 將被觀察者發送的事件轉換為任意的類型事件。
原理

應用情境
資料類型轉換

具體使用
下面以將 使用Map() 將事件的參數從 整型 變換成 字串類型 為例子說明

// 採用RxJava基於事件流的鏈式操作
Observable.create(new ObservableOnSubscribe<Integer>() {

// 1. 被觀察者發送事件 = 參數為整型 = 1、2、3
@Override
public void subscribe(ObservableEmitter<Integer> emitter) throws Exception {
emitter.onNext(1);
emitter.onNext(2);
emitter.onNext(3);

}
// 2. 使用Map變換操作符中的Function函數對被觀察者發送的事件進行統一變換:整型變換成字串類型
}).map(new Function<Integer, String>() {
@Override
public String apply(Integer integer) throws Exception {
return "使用 Map變換操作符 將事件" + integer +"的參數從 整型"+integer + " 變換成 字串類型" + integer ;
}
}).subscribe(new Consumer<String>() {

// 3. 觀察者接收事件時,是接收到變換後的事件 = 字串類型
@Override
public void accept(String s) throws Exception {
Log.d(TAG, s);
}
});
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
測試結果

從上面可以看出,map() 將參數中的 Integer 類型對象轉換成一個 String類型 對象後返回

同時,事件的參數類型也由 Integer 類型變成了 String 類型
3.2 FlatMap()

作用:將被觀察者發送的事件序列進行 拆分 & 單獨轉換,再合并成一個新的事件序列,最後再進行發送

原理

為事件序列中每個事件都建立一個 Observable 對象;
將對每個 原始事件 轉換後的 新事件 都放入到對應 Observable對象;
將建立的每個Observable 都合并到一個 建立的、總的Observable 對象;
建立的、總的Observable 對象 將 新合并的事件序列 發送給觀察者(Observer)

應用情境
無序的將被觀察者發送的整個事件序列進行變換

具體使用

// 採用RxJava基於事件流的鏈式操作
Observable.create(new ObservableOnSubscribe<Integer>() {
@Override
public void subscribe(ObservableEmitter<Integer> emitter) throws Exception {
emitter.onNext(1);
emitter.onNext(2);
emitter.onNext(3);
}

// 採用flatMap()變換操作符
}).flatMap(new Function<Integer, ObservableSource<String>>() {
@Override
public ObservableSource<String> apply(Integer integer) throws Exception {
final List<String> list = new ArrayList<>();
for (int i = 0; i < 3; i++) {
list.add("我是事件 " + integer + "拆分後的子事件" + i);
// 通過flatMap中將被觀察者生產的事件序列先進行拆分,再將每個事件轉換為一個新的發送三個String事件
// 最終合并,再發送給被觀察者
}
return Observable.fromIterable(list);
}
}).subscribe(new Consumer<String>() {
@Override
public void accept(String s) throws Exception {
Log.d(TAG, s);
}
});
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
測試結果

註:新合并產生的事件序列順序是無序的,即 與舊序列發送事件的順序無關
3.3 ConcatMap()

作用:類似FlatMap()操作符
與FlatMap()的 區別在於:拆分 & 重新合并產生的事件序列 的順序 = 被觀察者舊序列生產的順序

原理

應用情境
有序的將被觀察者發送的整個事件序列進行變換

具體使用

// 採用RxJava基於事件流的鏈式操作
Observable.create(new ObservableOnSubscribe<Integer>(www.078881.cn/) {
@Override
public void subscribe(ObservableEmitter<Integer> emitter) throws Exception {
emitter.onNext(1feifanshifan8.cn/);
emitter.onNext(2);
emitter.onNext(3);
}

// 採用concatMap()變換操作符
}).concatMap(new Function<Integer, ObservableSource<String>>() {
@Override
public ObservableSource<String> apply(Integer integer) throws Exception {
final List<String> list = new ArrayList<>();
for (int i = 0; i < 3; i++) {
list.add("我是事件 " + integer + "拆分後的子事件" + i);
// 通過concatMap中將被觀察者生產的事件序列先進行拆分,再將每個事件轉換為一個新的發送三個String事件
// 最終合并,再發送給被觀察者
}
return Observable.fromIterable(list);
}
}).subscribe(new Consumer<String>(www.jcx127.cn) {
@Override
public void accept(String www.tianhengyl1.com s) throws Exception {
Log.d(TAG, s);
}

測試結果

註:新合并產生的事件序列順序是有序的,即 嚴格按照舊序列發送事件的順序
3.4 Buffer()

作用
定期從 被觀察者(Obervable)需要發送的事件中 擷取一定數量的事件 & 放到緩衝區中,最終發送

Android RxJava操作符詳解系列: 變換操作符

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.