RxJava操作符系列二(上)
RxJava操作符源碼傳送門
- https://github.com/xiehui999/fuseProgram
在上篇文章RxJava操作符系列一我們介紹的操作符幾乎都是創(chuàng)建被觀察者的操作符,那么今天的這篇文章就介紹一下經(jīng)常用到的轉(zhuǎn)換操作符。話不多說,開始上車。
Map
該操作符是對原始Observable發(fā)射的每一項數(shù)據(jù)運(yùn)用一個函數(shù),然后返回一個發(fā)射這些結(jié)果的Observable。
例如我們有一個整形數(shù)組的數(shù)據(jù),當(dāng)大于5時輸出為true,則代碼實現(xiàn)
- Integer[] integers = {0, 9, 6, 4, 8};
- Observable.from(integers).map(new Func1() {
- @Override
- public Boolean call(Integer integer) {
- Log.e(TAG, "call: "+integer);
- return (integer > 5);
- }
- }).subscribe(new Subscriber() {
- @Override
- public void onCompleted() {
- Log.e(TAG, "onCompleted: ");
- }
- @Override
- public void onError(Throwable e) {
- Log.e(TAG, "onError: ");
- }
- @Override
- public void onNext(Boolean aBoolean) {
- Log.e(TAG, "onNext: "+aBoolean);
- }
- });
日志輸出信息
- call: 0
- onNext: false
- call: 9
- onNext: true
- call: 6
- onNext: true
- call: 4
- onNext: false
- call: 8
- onNext: true
- onCompleted:
對于map,他可以將將數(shù)據(jù)源變換為你想要的類型,比如,你想獲取有一個Student對象(里面age,name屬性)那么我們可以通過map只獲取name。接下來。我們再舉個例子,我們根據(jù)一個圖片路徑獲取圖片并將圖片設(shè)置到ImageView,然后將ImageView加的我們的布局中。
- String path = Environment.getExternalStorageDirectory()+ File.separator+"aaa.jpg";
- Observable.just(path)
- .subscribeOn(Schedulers.io())
- .map(new Func1() {
- @Override
- public Bitmap call(String s) {
- Bitmap bitmap = BitmapFactory.decodeFile(s);
- Log.e(TAG, "call: Bitmap"+bitmap);
- return bitmap;
- }
- }).map(new Func1() {
- @Override
- public ImageView call(Bitmap bitmap) {
- Log.e(TAG, "call: ImageView");
- ImageView imageView = new ImageView(getActivity());
- LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT);
- imageView.setLayoutParams(params);
- imageView.setImageBitmap(bitmap);
- return imageView;
- }
- }).observeOn(AndroidSchedulers.mainThread())
- .subscribe(new Subscriber() {
- @Override
- public void onCompleted() {
- Log.e(TAG, "onCompleted: ");
- }
- @Override
- public void onError(Throwable e) {
- Log.e(TAG, "onError: ");
- }
- @Override
- public void onNext(ImageView imageView) {
- Log.e(TAG, "onNext: ");
- layout.addView(imageView);
- }
- });
Cast
該操作符就是做一些強(qiáng)制類型轉(zhuǎn)換操作的。例如,當(dāng)我們在頁面跳轉(zhuǎn)時數(shù)據(jù)對象往往是序列化的,當(dāng)我們在新的頁面收到數(shù)據(jù)后就要強(qiáng)制轉(zhuǎn)換為我們想要的類型。cast操作符也可以實現(xiàn)這樣的功能。如下
- Observable.just(serializable).cast(FileInfo.class).subscribe(new Subscriber() {
- @Override
- public void onCompleted() {
- Log.e(TAG, "onCompleted: " );
- }
- @Override
- public void onError(Throwable e) {
- Log.e(TAG, "onError: " );
- }
- @Override
- public void onNext(FileInfo fileInfo) {
- Log.e(TAG, "onNext: "+fileInfo.toString());
- tv1.append("\n"+fileInfo.toString());
- }
- });
不過在該操作符實際用途并沒有那么的廣泛,很少用到,當(dāng)然這個操作符也可以達(dá)到j(luò)ava 中instanceof相同的作用,用于類型檢查,當(dāng)不是該類型就會執(zhí)行onError()方法。
FlatMap
該操作符與map操作符的區(qū)別是它將一個發(fā)射數(shù)據(jù)的Observable變換為多個Observables,然后將它們發(fā)射的數(shù)據(jù)合并后放進(jìn)一個單獨的Observable.
- Integer[] integers = {1, 2, 3};
- Observable.from(integers).flatMap(new Func1>() {
- @Override
- public Observable call(final Integer integer) {
- return Observable.create(new Observable.OnSubscribe() {
- @Override
- public void call(Subscriber super String> subscriber) {
- Log.e(TAG, "call: FlatMap " + Thread.currentThread().getName());
- try {
- Thread.sleep(200);
- subscriber.onNext(integer + 100 + " FlatMap");
- subscriber.onCompleted();
- } catch (InterruptedException e) {
- e.printStackTrace();
- subscriber.onError(e);
- }
- }
- }).subscribeOn(Schedulers.newThread());
- }
- }).observeOn(AndroidSchedulers.mainThread())
- .subscribe(new Subscriber() {
- @Override
- public void onCompleted() {
- Log.e(TAG, "onCompleted: FlatMap");
- }
- @Override
- public void onError(Throwable e) {
- Log.e(TAG, "onError: FlatMap");
- }
- @Override
- public void onNext(String s) {
- Log.e(TAG, "onNext: FlatMap " + s);
- }
- });
打印日志信息
- call: FlatMap RxNewThreadScheduler-2
- call: FlatMap RxNewThreadScheduler-3
- call: FlatMap RxNewThreadScheduler-4
- onNext: FlatMap 101 FlatMap
- onNext: FlatMap 102 FlatMap
- onNext: FlatMap 103 FlatMap
- onCompleted: FlatMap
ConcatMap
該操作符是類似于最簡單版本的flatMap,但是它按次序連接而不是合并那些生成的Observables,然后產(chǎn)生自己的數(shù)據(jù)序列.將上述flatMap代碼更改如下
- Integer[] integers = {1, 2, 3};
- Observable.from(integers).concatMap(new Func1>() {
- @Override
- public Observable call(final Integer integer) {
- return Observable.create(new Observable.OnSubscribe() {
- @Override
- public void call(Subscriber super String> subscriber) {
- Log.e(TAG, "call:2 ConcatMap " + Thread.currentThread().getName());
- try {
- Thread.sleep(200);
- subscriber.onNext(integer + 100 + " ConcatMap");
- subscriber.onCompleted();
- } catch (InterruptedException e) {
- e.printStackTrace();
- subscriber.onError(e);
- }
- }
- }).subscribeOn(Schedulers.newThread());
- }
- }).observeOn(AndroidSchedulers.mainThread())
- .subscribe(new Subscriber() {
- @Override
- public void onCompleted() {
- Log.e(TAG, "onCompleted: ConcatMap");
- }
- @Override
- public void onError(Throwable e) {
- Log.e(TAG, "onError: ConcatMap");
- }
- @Override
- public void onNext(String s) {
- Log.e(TAG, "onNext: ConcatMap " +s);
- }
- });
接下文