程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> 關於PHP編程 >> RxJava操作符(七)Conditional and Boolean

RxJava操作符(七)Conditional and Boolean

編輯:關於PHP編程

RxJava操作符(七)Conditional and Boolean


在這篇文章裡我們來了解一下條件和布爾操作符。

一、All/Amb
All操作符根據一個函數對源Observable發射的所有數據進行判斷,最終返回的結果就是這個判斷結果。這個函數使用發射的數據作為參數,內部判斷所有的數據是否滿足我們定義好的判斷條件,如果全部都滿足則返回true,否則就返回false。

Amb操作符可以將至多9個Observable結合起來,讓他們競爭。哪個Observable首先發射了數據(包括onError和onComplete)就會繼續發射這個Observable的數據,其他的Observable所發射的數據都會別丟棄。

下面使用這兩個操作符,對於all操作符我們做了這樣的限制,初次使用的時候tag為false,會創建6個數字的Observable,以後都會創建5個數字的Observable。

  1. private Observable<Boolean> allObserver() {
  2. Observable<Integer> just;
  3. if (tag) {
  4. just = Observable.just(1, 2, 3, 4, 5);
  5. } else {
  6. just = Observable.just(1, 2, 3, 4, 5, 6);
  7. }
  8. tag = true;
  9. return just.all(integer -> integer < 6);
  10. }

  11. private Observable<Integer> ambObserver() {
  12. Observable<Integer> delay3 = Observable.just(1, 2, 3).delay(3000, TimeUnit.MILLISECONDS);
  13. Observable<Integer> delay2 = Observable.just(4, 5, 6).delay(2000, TimeUnit.MILLISECONDS);
  14. Observable<Integer> delay1 = Observable.just(7, 8, 9).delay(1000, TimeUnit.MILLISECONDS);
  15. return Observable.amb(delay1, delay2, delay3);
  16. }
分別進訂閱

  1. mLButton.setText("all");
  2. mLButton.setOnClickListener(e -> allObserver().subscribe(i -> log("all:" + i)));
  3. mRButton.setText("amb");
  4. mRButton.setOnClickListener(e -> ambObserver().subscribe(i -> log("amb:" + i)));
運行結果如下所示。第一次返回的6個數據的Observable不滿足所有都小於6的條件,所以結果是false,以後的都滿足條件,所以結果是true。使用amb操作符的Observable,第一個發射的數據的是7,所以輸出了7,8,9,其他的數據都丟棄了。


二、Contains、IsEmpty
Contains操作符用來判斷源Observable所發射的數據是否包含某一個數據,如果包含會返回true,如果源Observable已經結束了卻還沒有發射這個數據則返回false。
IsEmpty操作符用來判斷源Observable是否發射過數據,如果發射過就會返回false,如果源Observable已經結束了卻還沒有發射這個數據則返回true。

用這兩個操作符來判斷一下兩個Observable對象是否包含某個數據及是否為空

  1. private Observable<Boolean> containsObserver() {
  2. if (tag) {
  3. return Observable.just(1, 2, 3).contains(3);
  4. }
  5. tag = true;
  6. return Observable.just(1, 2, 3).contains(4);
  7. }

  8. private Observable<Boolean> defaultObserver() {
  9. return Observable.create(new Observable.OnSubscribe<Integer>() {
  10. @Override
  11. public void call(Subscriber<? super Integer> subscriber) {
  12. subscriber.onCompleted();
  13. }
  14. }).isEmpty();
  15. }
分別進行訂閱

  1. mLButton.setText("contains");
  2. mLButton.setOnClickListener(e -> containsObserver().subscribe(i -> log("contains:" + i)));
  3. mRButton.setText("isEmpty");
  4. mRButton.setOnClickListener(e -> defaultObserver().subscribe(i -> log("isEmpty:" + i)));
運行結果如下


三、DefaultIfEmpty
DefaultIfEmpty操作符會判斷源Observable是否發射數據,如果源Observable發射了數據則正常發射這些數據,如果沒有則發射一個默認的數據

下面我們用這個操作符來處理一個空的和一個非空的Observable,如果為空的話就返回默認值10

  1. private Observable<Integer> emptyObserver() {
  2. return Observable.create(new Observable.OnSubscribe<Integer>() {
  3. @Override
  4. public void call(Subscriber<? super Integer> subscriber) {
  5. subscriber.onCompleted();
  6. }
  7. }).defaultIfEmpty(10);
  8. }

  9. private Observable<Integer> notEmptyObserver() {
  10. return Observable.create(new Observable.OnSubscribe<Integer>() {
  11. @Override
  12. public void call(Subscriber<? super Integer> subscriber) {
  13. subscriber.onNext(1);
  14. subscriber.onCompleted();
  15. }
  16. }).defaultIfEmpty(10);
  17. }
分別進行訂閱

  1. mLButton.setText("empty");
  2. mLButton.setOnClickListener(e -> emptyObserver().subscribe(i -> log("empty:" + i)));
  3. mRButton.setText("notEmpty");
  4. mRButton.setOnClickListener(e -> notEmptyObserver().subscribe(i -> log("notEmpty:" + i)));
運行結果如下


四、SequenceEqual
SequenceEqual操作符用來判斷兩個Observable發射的數據序列是否相同(發射的數據相同,數據的序列相同,結束的狀態相同),如果相同返回true,否則返回false

下面用SequenceEqual分別來判斷兩個相同的和不相同的Observable

  1. private Observable<Boolean> equalObserver() {
  2. return Observable.sequenceEqual(Observable.just(1, 2, 3), Observable.just(1, 2, 3));
  3. }

  4. private Observable<Boolean> notEqualObserver() {
  5. return Observable.sequenceEqual(Observable.just(1, 2, 3), Observable.just(1, 2));
  6. }
分別進行訂閱

  1. mLButton.setText("equal");
  2. mLButton.setOnClickListener(e -> equalObserver().subscribe(i -> log("equal:" + i)));
  3. mRButton.setText("notequal");
  4. mRButton.setOnClickListener(e -> notEqualObserver().subscribe(i -> log("notequal:" + i)));
運行結果如下


五、SkipUntil、SkipWhile
這兩個操作符都是根據條件來跳過一些數據,不同之處在於SkipUnitl是根據一個標志Observable來判斷的,當這個標志Observable沒有發射數據的時候,所有源Observable發射的數據都會被跳過;當標志Observable發射了一個數據,則開始正常地發射數據。SkipWhile則是根據一個函數來判斷是否跳過數據,當函數返回值為true的時候則一直跳過源Observable發射的數據;當函數返回false的時候則開始正常發射數據。

下面使用這兩個操作符來跳過一些數據項。

  1. private Observable<Long> skipUntilObserver() {
  2. return Observable.interval(1, TimeUnit.SECONDS).skipUntil(Observable.timer(3, TimeUnit.SECONDS));
  3. }

  4. private Observable<Long> skipWhileObserver() {
  5. return Observable.interval(1, TimeUnit.SECONDS).skipWhile(aLong -> aLong < 5);
  6. }
分別進行訂閱

  1. mLButton.setText("skipUntil");
  2. mLButton.setOnClickListener(e -> skipUntilObserver().subscribe(i -> log("skipUntil:" + i)));
  3. mRButton.setText("skipWhile");
  4. mRButton.setOnClickListener(e -> skipWhileObserver().subscribe(i -> log("skipWhile:" + i)));
運行結果如下


六、TakeUntil、TakeWhile
TakeUntil和TakeWhile操作符可以說和SkipUnitl和SkipWhile操作符是完全相反的功能。TakeUntil也是使用一個標志Observable是否發射數據來判斷,當標志Observable沒有發射數據時,正常發射數據,而一旦標志Observable發射過了數據則後面的數據都會被丟棄。TakeWhile則是根據一個函數來判斷是否發射數據,當函數返回值為true的時候正常發射數據;當函數返回false的時候丟棄所有後面的數據。


下面使用這兩個操作符來take兩個Observable發射的數據

  1. private Observable<Long> takeUntilObserver() {
  2. return Observable.interval(1, TimeUnit.SECONDS).takeUntil(Observable.timer(3, TimeUnit.SECONDS));
  3. }

  4. private Observable<Long> takeWhileObserver() {
  5. return Observable.interval(1, TimeUnit.SECONDS).takeWhile(aLong -> aLong < 5);
  6. }
分別進行訂閱

  1. mLButton.setText("takeUntil");
  2. mLButton.setOnClickListener(e -> takeUntilObserver().subscribe(i -> log("takeUntil:" + i)));
  3. mRButton.setText("takeWhile");
  4. mRButton.setOnClickListener(e -> takeWhileObserver().subscribe(i -> log("takeWhile:" + i)));
運行結果如下


關於條件和布爾操作符就到這了,本文中所有的demo程序見:https://github.com/Chaoba/RxJavaDemo

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved