自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

RxJava操作符系列二(上)

移動開發(fā) Android
在上篇文章RxJava操作符系列一我們介紹的操作符幾乎都是創(chuàng)建被觀察者的操作符,那么今天的這篇文章就介紹一下經(jīng)常用到的轉(zhuǎn)換操作符。

[[180035]]

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)

  1. Integer[] integers = {0, 9, 6, 4, 8}; 
  2.         Observable.from(integers).map(new Func1() { 
  3.             @Override 
  4.             public Boolean call(Integer integer) { 
  5.                 Log.e(TAG, "call: "+integer); 
  6.                 return (integer > 5); 
  7.             } 
  8.         }).subscribe(new Subscriber() { 
  9.             @Override 
  10.             public void onCompleted() { 
  11.                 Log.e(TAG, "onCompleted: "); 
  12.             } 
  13.   
  14.             @Override 
  15.             public void onError(Throwable e) { 
  16.                 Log.e(TAG, "onError: "); 
  17.             } 
  18.   
  19.             @Override 
  20.             public void onNext(Boolean aBoolean) { 
  21.                 Log.e(TAG, "onNext: "+aBoolean); 
  22.             } 
  23.         });  

日志輸出信息

  1. call: 0 
  2. onNext: false 
  3. call: 9 
  4. onNext: true 
  5. call: 6 
  6. onNext: true 
  7. call: 4 
  8. onNext: false 
  9. call: 8 
  10. onNext: true 
  11. onCompleted:  

對于map,他可以將將數(shù)據(jù)源變換為你想要的類型,比如,你想獲取有一個Student對象(里面age,name屬性)那么我們可以通過map只獲取name。接下來。我們再舉個例子,我們根據(jù)一個圖片路徑獲取圖片并將圖片設(shè)置到ImageView,然后將ImageView加的我們的布局中。 

  1. String path = Environment.getExternalStorageDirectory()+ File.separator+"aaa.jpg"
  2.         Observable.just(path) 
  3.                 .subscribeOn(Schedulers.io()) 
  4.                 .map(new Func1() { 
  5.                     @Override 
  6.                     public Bitmap call(String s) { 
  7.                         Bitmap bitmap = BitmapFactory.decodeFile(s); 
  8.                         Log.e(TAG, "call: Bitmap"+bitmap); 
  9.                         return bitmap; 
  10.                     } 
  11.                 }).map(new Func1() { 
  12.             @Override 
  13.             public ImageView call(Bitmap bitmap) { 
  14.                 Log.e(TAG, "call: ImageView"); 
  15.                 ImageView imageView = new ImageView(getActivity()); 
  16.                 LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT); 
  17.                 imageView.setLayoutParams(params); 
  18.                 imageView.setImageBitmap(bitmap); 
  19.                 return imageView; 
  20.             } 
  21.         }).observeOn(AndroidSchedulers.mainThread()) 
  22.                 .subscribe(new Subscriber() { 
  23.                     @Override 
  24.                     public void onCompleted() { 
  25.                         Log.e(TAG, "onCompleted: "); 
  26.                     } 
  27.                     @Override 
  28.                     public void onError(Throwable e) { 
  29.                         Log.e(TAG, "onError: "); 
  30.                     } 
  31.   
  32.                     @Override 
  33.                     public void onNext(ImageView imageView) { 
  34.                         Log.e(TAG, "onNext: "); 
  35.                         layout.addView(imageView); 
  36.                     } 
  37.                 });  

Cast

該操作符就是做一些強(qiáng)制類型轉(zhuǎn)換操作的。例如,當(dāng)我們在頁面跳轉(zhuǎn)時數(shù)據(jù)對象往往是序列化的,當(dāng)我們在新的頁面收到數(shù)據(jù)后就要強(qiáng)制轉(zhuǎn)換為我們想要的類型。cast操作符也可以實現(xiàn)這樣的功能。如下

  1. Observable.just(serializable).cast(FileInfo.class).subscribe(new Subscriber() { 
  2.             @Override 
  3.             public void onCompleted() { 
  4.                 Log.e(TAG, "onCompleted: " ); 
  5.             } 
  6.   
  7.             @Override 
  8.             public void onError(Throwable e) { 
  9.                 Log.e(TAG, "onError: " ); 
  10.             } 
  11.   
  12.             @Override 
  13.             public void onNext(FileInfo fileInfo) { 
  14.                 Log.e(TAG, "onNext: "+fileInfo.toString()); 
  15.                 tv1.append("\n"+fileInfo.toString()); 
  16.             } 
  17.         });  

不過在該操作符實際用途并沒有那么的廣泛,很少用到,當(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.

  1. Integer[] integers = {1, 2, 3}; 
  2.         Observable.from(integers).flatMap(new Func1>() { 
  3.             @Override 
  4.             public Observable call(final Integer integer) { 
  5.                 return Observable.create(new Observable.OnSubscribe() { 
  6.                     @Override 
  7.                     public void call(Subscriber super String> subscriber) { 
  8.                         Log.e(TAG, "call: FlatMap " + Thread.currentThread().getName()); 
  9.                         try { 
  10.                             Thread.sleep(200); 
  11.                             subscriber.onNext(integer + 100 + " FlatMap"); 
  12.                             subscriber.onCompleted(); 
  13.                         } catch (InterruptedException e) { 
  14.                             e.printStackTrace(); 
  15.                             subscriber.onError(e); 
  16.                         } 
  17.                     } 
  18.                 }).subscribeOn(Schedulers.newThread()); 
  19.             } 
  20.         }).observeOn(AndroidSchedulers.mainThread()) 
  21.                 .subscribe(new Subscriber() { 
  22.                     @Override 
  23.                     public void onCompleted() { 
  24.                         Log.e(TAG, "onCompleted: FlatMap"); 
  25.                     } 
  26.   
  27.                     @Override 
  28.                     public void onError(Throwable e) { 
  29.                         Log.e(TAG, "onError: FlatMap"); 
  30.                     } 
  31.   
  32.                     @Override 
  33.                     public void onNext(String s) { 
  34.                         Log.e(TAG, "onNext: FlatMap " + s); 
  35.                     } 
  36.                 });  

打印日志信息 

  1. call: FlatMap RxNewThreadScheduler-2 
  2. call: FlatMap RxNewThreadScheduler-3 
  3. call: FlatMap RxNewThreadScheduler-4 
  4. onNext: FlatMap 101 FlatMap 
  5. onNext: FlatMap 102 FlatMap 
  6. onNext: FlatMap 103 FlatMap 
  7. onCompleted: FlatMap  

ConcatMap

該操作符是類似于最簡單版本的flatMap,但是它按次序連接而不是合并那些生成的Observables,然后產(chǎn)生自己的數(shù)據(jù)序列.將上述flatMap代碼更改如下 

  1. Integer[] integers = {1, 2, 3}; 
  2.         Observable.from(integers).concatMap(new Func1>() { 
  3.             @Override 
  4.             public Observable call(final Integer integer) { 
  5.                 return Observable.create(new Observable.OnSubscribe() { 
  6.                     @Override 
  7.                     public void call(Subscriber super String> subscriber) { 
  8.                         Log.e(TAG, "call:2 ConcatMap " + Thread.currentThread().getName()); 
  9.                         try { 
  10.                             Thread.sleep(200); 
  11.                             subscriber.onNext(integer + 100 + " ConcatMap"); 
  12.                             subscriber.onCompleted(); 
  13.                         } catch (InterruptedException e) { 
  14.                             e.printStackTrace(); 
  15.                             subscriber.onError(e); 
  16.                         } 
  17.                     } 
  18.                 }).subscribeOn(Schedulers.newThread()); 
  19.             } 
  20.         }).observeOn(AndroidSchedulers.mainThread()) 
  21.                 .subscribe(new Subscriber() { 
  22.                     @Override 
  23.                     public void onCompleted() { 
  24.                         Log.e(TAG, "onCompleted: ConcatMap"); 
  25.                     } 
  26.   
  27.                     @Override 
  28.                     public void onError(Throwable e) { 
  29.                         Log.e(TAG, "onError: ConcatMap"); 
  30.                     } 
  31.   
  32.                     @Override 
  33.                     public void onNext(String s) { 
  34.                         Log.e(TAG, "onNext: ConcatMap " +s); 
  35.                     } 
  36.                 });  

接下文

責(zé)任編輯:龐桂玉 來源: 安卓開發(fā)精選
相關(guān)推薦

2017-01-03 15:56:20

RxJava操作符Android

2016-12-28 09:54:50

AndroidRxJava操作符

2017-01-03 16:12:13

RxJava操作符Android

2016-11-17 15:35:51

RxJava操作Subscriber

2010-07-14 14:55:07

Perl操作符

2009-08-19 17:26:28

C# 操作符

2021-10-31 18:59:55

Python操作符用法

2011-04-08 16:26:14

JavaScript

2010-07-19 11:00:24

Perl操作符

2010-07-14 14:30:31

Perl操作符

2009-07-21 09:31:00

Scala操作符

2009-09-15 17:16:58

LINQ查詢操作符

2009-09-16 09:09:23

Linq Contai

2010-07-14 14:18:51

Perl操作符

2012-02-06 09:13:23

LINQ

2010-01-28 11:16:28

C++操作符

2010-07-13 11:11:39

Perl標(biāo)量

2009-11-30 16:48:08

PHP操作符

2009-07-14 18:34:22

Jython操作符重載

2009-11-27 09:41:56

LINQ
點贊
收藏

51CTO技術(shù)棧公眾號