RxJava操作符(一)

注:只包含標準包中的操作符,用于個人學習及備忘
參考博客:http://blog.csdn.net/maplejaw_/article/details/52396175

本篇將介紹rxjava中的創建操作、合并操作、過濾操作、條件/布爾操作、聚合操作、轉換操作以及變換操作,只針對用法不涉及原理,對RxJava不熟悉的可參考:http://gank.io/post/560e15be2dca930e00da1083

創建操作

  • create:使用OnSubscrib直接創建一個Observable

     Observable.create(new Observable.OnSubscribe<String>() {
          @Override
          public void call(Subscriber<? super String> subscriber) {
              subscriber.onNext("item1");
              subscriber.onNext("item2");
              subscriber.onCompleted();
          }
      });
    
  • from:將數組或集合拆分成具體對象后,轉換成發送這些對象的Observable

      String[] arr = {"item1", "item2", "item3"};
      Observable.from(arr)
              .subscribe(new Action1<String>() {
                  @Override
                  public void call(String s) {
                      Log.d("debug", s);      //調用多次,分別打印出item1,item2,item3
                  }
              });
    
  • just:將一個或多個對象轉換成發送這些對象的Obserbable

      Observable.just("item1","item2","item3")
              .subscribe(new Action1<String>() {
                  @Override
                  public void call(String s) {
                      Log.d("debug", s);      //調用多次,分別打印出item1,item2,item3
                  }
              });
    
  • empty:創建一個直接通知完成的Observable

  • error:創建一個直接通知錯誤的Observable

  • never:創建一個什么都不做的Observable

      Observable observable1 = Observable.empty();    //直接調用onCompleted()方法
      Observable observable2 = Observable.error(new RuntimeException());  //直接調用onError()方法
      Observable observable3 = Observable.never();    //onNext(),onCompleted(),onError()均不調用
    
  • timer:創建一個延時發射數據的Observable

      Observable.timer(1000, TimeUnit.MILLISECONDS)
              .subscribe(new Action1<Long>() {
                  @Override
                  public void call(Long aLong) {
                      Log.d("debug", aLong.toString());   //aLong為0
                  }
              });
    
  • interval:創建一個按照給定的時間間隔發射送0開始的整數序列的Obervable

      Observable.interval(2, 1, TimeUnit.SECONDS)
              .subscribe(new Action1<Long>() {
                  @Override
                  public void call(Long aLong) {
                      //等待2秒后開始發射數據,發射的時間間隔為1秒,從0開始計數
                  }
              });
    
      Observable.interval(1, TimeUnit.SECONDS)
              .subscribe(new Action1<Long>() {
                  @Override
                  public void call(Long aLong) {
                      //等待1秒后開始發射數據,發射的時間間隔為1秒,從0開始計數
                      //相當于Observable.interval(1, 1, TimeUnit.SECONDS)
                  }
              });
    
  • range:創建一個發射指定范圍的整數序列的Observable

      Observable.range(3, 4)
              .subscribe(new Action1<Integer>() {
                  @Override
                  public void call(Integer integer) {
                      Log.d("debug", integer.toString());//依次發射3,4,5,6,從3開始發射4個數據
                  }
              });
    
  • defer:觀察者訂閱時才創建Observable,每次訂閱返回一個新的Observable

      Observable.defer(new Func0<Observable<String>>() {
          @Override
          public Observable<String> call() {
              return Observable.just("s");
          }
      }).subscribe(new Action1<String>() {
          @Override
          public void call(String s) {
              Log.d("debug", s);      //打印s
          }
      });
    

合并操作(用于組合多個Observavle)

  • concat:按順序連接多個Observable,注:Observable.concat(a,b)等價于a.concatWith(b)

      Observable<Integer> observable1 = Observable.just(1, 2, 3);
      Observable<Integer> observable2 = Observable.just(4, 5, 6);
    
      Observable.concat(observable1, observable2)
              .subscribe(new Action1<Integer>() {
                  @Override
                  public void call(Integer integer) {
                      Log.d("debug", integer.toString()); //打印1,2,3,4,5,6
                  }
              });
    
  • startWith:在數據序列的開頭增加一項數據,內部調用concat

     Observable.just(1, 2, 3)
             .startWith(Observable.just(4, 5))   //添加一個Observable
             .subscribe(new Action1<Integer>() {
                 @Override
                 public void call(Integer integer) {
                     Log.d("debug", integer.toString()); //打印4,5,1,2,3
                 }
             });
    
     Observable.just(1,2,3)
             .startWith(4,5)     //添加多個數據
             .subscribe(new Action1<Integer>() {
                 @Override
                 public void call(Integer integer) {
                     Log.d("debug", integer.toString()); //打印4,5,1,2,3
                 }
             });
    
     List<Integer> integers = new ArrayList<>();
     integers.add(4);
     integers.add(5);
     Observable.just(1,2,3)
             .startWith(integers)    //添加一個集合
             .subscribe(new Action1<Integer>() {
                 @Override
                 public void call(Integer integer) {
                     Log.d("debug", integer.toString()); //打印4,5,1,2,3
                 }
             });
    
  • merge / mergeDelayError:將多個Observable合并為一個。不同于concat,merge不是按照添加順序連接,而是按照時間線來連接。其中mergeDelayError將異常延遲到其它沒有錯誤的Observable發送完畢后才發射。而merge則是一遇到異常將停止發射數據,發送onError通知

merge工作流程
    Observable<Integer> observable1 = Observable.create(new Observable.OnSubscribe<Integer>() {
        @Override
        public void call(Subscriber<? super Integer> subscriber) {
            subscriber.onNext(1);
            SystemClock.sleep(1000);
            subscriber.onNext(2);
            subscriber.onNext(3);
            subscriber.onCompleted();
        }
    }).subscribeOn(Schedulers.computation());

    Observable<Integer> observable2 = Observable.create(new Observable.OnSubscribe<Integer>() {
        @Override
        public void call(Subscriber<? super Integer> subscriber) {
            SystemClock.sleep(500);
            subscriber.onNext(4);
            subscriber.onNext(5);
            SystemClock.sleep(1000);
            subscriber.onNext(6);
            subscriber.onCompleted();
        }
    }).subscribeOn(Schedulers.computation());

    Observable.merge(observable1, observable2)
            .subscribe(new Action1<Integer>() {
                @Override
                public void call(Integer integer) {
                    Log.d("debug", integer.toString()); //打印1,4,5,2,3,6
                }
            });
  • zip:使用一個函數組合多個Observable發射的數據集合,再發射這個結果。如果多個Observable發射的數據量不一樣,則以最少的Observable為標準進行壓合
zip工作流程
    Observable<Integer> observable1 = Observable.just(1, 2, 3, 4, 5);
    Observable<String> observable2 = Observable.just("A", "B", "C", "D");
    Observable.zip(observable1, observable2, new Func2<Integer, String, String>() {
        @Override
        public String call(Integer integer, String s) {
            return integer + s;
        }
    }).subscribe(new Action1<String>() {
        @Override
        public void call(String s) {
            Log.d("debug", s);  //打印1A,2B,3C,4D
        }
    });
  • combineLatest:當兩個Observable中任何一個發射了一個數據時,通過一個指定的函數組合每個Observable發射的最新數據(一共兩個數據),然后發射這個函數的結果。類似于zip,但是,不同的是zip只有在每個Observable都發射了數據才工作,而combineLatest任何一個發射了數據都可以工作,每次與另一個Observable最近的數據壓合
combineLatest工作流程
    Observable<Integer> observable1 = Observable.create(new Observable.OnSubscribe<Integer>() {
        @Override
        public void call(Subscriber<? super Integer> subscriber) {
            subscriber.onNext(1);
            SystemClock.sleep(500);
            subscriber.onNext(2);
            SystemClock.sleep(1000);
            subscriber.onNext(3);
            SystemClock.sleep(300);
            subscriber.onNext(4);
            SystemClock.sleep(500);
            subscriber.onNext(5);
            subscriber.onCompleted();
        }
    }).subscribeOn(Schedulers.computation());

    Observable<String> observable2 = Observable.create(new Observable.OnSubscribe<String>() {
        @Override
        public void call(Subscriber<? super String> subscriber) {
            SystemClock.sleep(300);
            subscriber.onNext("A");
            SystemClock.sleep(300);
            subscriber.onNext("B");
            SystemClock.sleep(500);
            subscriber.onNext("C");
            subscriber.onNext("D");
            subscriber.onCompleted();
        }
    }).subscribeOn(Schedulers.computation());

    Observable.combineLatest(observable1, observable2, new Func2<Integer, String, String>() {
        @Override
        public String call(Integer integer, String s) {
            return integer + s;
        }
    }).subscribe(new Action1<String>() {
        @Override
        public void call(String s) {
            Log.d("debug", s);  //打印1A,2A,2B,2C,2D,3D,4D,5D
        }
    });

過濾操作

  • filter:過濾數據

      Observable.just(1, 2, 3, 4)
              .filter(new Func1<Integer, Boolean>() {
                  @Override
                  public Boolean call(Integer integer) {
                      return integer % 2 == 0;    //過濾偶數
                  }
              })
              .subscribe(new Action1<Integer>() {
                  @Override
                  public void call(Integer integer) {
                      Log.d("debug", integer.toString()); //打印2,4
                  }
              });
    
  • ofType:過濾指定類型數據

      Observable.just(1, "2", 3, "4")
              .ofType(Integer.class)  //過濾整形數據
              .subscribe(new Action1<Integer>() {
                  @Override
                  public void call(Integer integer) {
                      Log.d("debug", integer.toString()); //打印1,3
                  }
              });
    
  • take:只發射前n項數據或者一定時間內的數據(無需考慮索引越界問題,配合interval操作符可作為定時器使用)

      Observable.just(1, 2, 3, 4)
              .take(2)    //只發射前2項
              .subscribe(new Action1<Integer>() {
                  @Override
                  public void call(Integer integer) {
                      Log.d("debug", integer.toString()); //打印1,2
                  }
              });
    
      Observable.interval(1, TimeUnit.SECONDS)
              .take(3, TimeUnit.SECONDS)  //只發射3秒內的數據
              .subscribe(new Action1<Long>() {
                  @Override
                  public void call(Long aLong) {
                      //打印0,1(打印出來的并不是相像中的0,1,2,應該與代碼代碼執行的時間有關,使用時需要注意?。?                  Log.d("debug", aLong.toString());   
                  }
              });
    
  • takeLast:只發射最后的N項數據或者一定時間內的數據(無需考慮索引越界問題)

      Observable.just(1, 2, 3, 4)
              .takeLast(3)    //只發射后3項
              .subscribe(new Action1<Integer>() {
                  @Override
                  public void call(Integer integer) {
                      Log.d("debug", integer.toString()); //打印2,3,4
                  }
              });
    
      Observable.interval(1, TimeUnit.SECONDS)
              .take(10)   //每1秒發射一個數據,發射10秒
              .takeLast(3, TimeUnit.SECONDS)  //只發射最后3秒的數據
              .subscribe(new Action1<Long>() {
                  @Override
                  public void call(Long aLong) {
                      Log.d("debug", aLong.toString());   //打印6,7,8,9(同樣存在些許誤差,使用時需注意!)
                  }
              });
    
      Observable.interval(1, TimeUnit.SECONDS)
              .take(10)
              .takeLast(2, 3, TimeUnit.SECONDS)   //只發射最后3秒內的最后2個數據
              .subscribe(new Action1<Long>() {
                  @Override
                  public void call(Long aLong) {
                      Log.d("debug", aLong.toString());   //打印8,9
                  }
              });
    
  • takeFirst:只發射滿足條件的第一項(其實就是filter+take)

      Observable.just(1, 2, 3, 4)
              .takeFirst(new Func1<Integer, Boolean>() {
                  @Override
                  public Boolean call(Integer integer) {
                      return integer > 1;
                  }
              })
              .subscribe(new Action1<Integer>() {
                  @Override
                  public void call(Integer integer) {
                      Log.d("debug", integer.toString()); //打印2
                  }
              });
    

*first / firstOrDefault:只發射第一項或者滿足條件的第一項數據,其中firstOrDefault可以指定默認值(建議使用firstOrDefault,找不到對應元素時first會報異常)

    Observable.just(1, 2, 3)
            .first()    //發射第一項
            .subscribe(new Action1<Integer>() {
                @Override
                public void call(Integer integer) {
                    Log.d("debug", integer.toString()); //打印1
                }
            });

    Observable.just(1, 2, 3, 4)
            .first(new Func1<Integer, Boolean>() {  //發射大于2的第一項
                @Override
                public Boolean call(Integer integer) {
                    return integer > 2;
                }
            })
            .subscribe(new Action1<Integer>() {
                @Override
                public void call(Integer integer) {
                    Log.d("debug", integer.toString()); //打印3
               }
            });

    Integer[] arr = {};
    Observable.from(arr)
            .firstOrDefault(2)  //發射第一項,沒有可發射的數據時,發射默認值2
            .subscribe(new Action1<Integer>() {
                @Override
                public void call(Integer integer) {
                    Log.d("debug", integer.toString()); //打印2
                }
            });
  • last / lastOrDefault:只發射最后一項或滿足條件的最后一項,其中lastOrDefault可以指定默認值

      Observable.just(1, 2, 3)
              .last()    //發射最后一項
              .subscribe(new Action1<Integer>() {
                  @Override
                  public void call(Integer integer) {
                      Log.d("debug", integer.toString()); //打印3
                  }
              });
    
      Observable.just(1, 2, 3, 4)
              .last(new Func1<Integer, Boolean>() {  //發射大于2的最后一項
                  @Override
                  public Boolean call(Integer integer) {
                      return integer > 2;
                  }
              })
              .subscribe(new Action1<Integer>() {
                  @Override
                  public void call(Integer integer) {
                      Log.d("debug", integer.toString()); //打印4
                 }
              });
    
      Integer[] arr = {};
      Observable.from(arr)
              .lastOrDefault(2)  //發射最后一項,沒有可發射的數據時,發射默認值2
              .subscribe(new Action1<Integer>() {
                  @Override
                  public void call(Integer integer) {
                      Log.d("debug", integer.toString()); //打印2
                  }
              });
    
  • skip:跳過開始的n項數據或者一定時間內的數據(與take類似)

      Observable.just(1, 2, 3, 4)
              .skip(2)    //跳過前2項
              .subscribe(new Action1<Integer>() {
                  @Override
                  public void call(Integer integer) {
                      Log.d("debug", integer.toString());     //打印3,4
                  }
              });
    
      Observable.interval(1, TimeUnit.SECONDS)
              .take(5)
              .skip(3, TimeUnit.SECONDS)   //跳過前3秒
              .subscribe(new Action1<Long>() {
                  @Override
                  public void call(Long aLong) {
                      Log.d("debug", aLong.toString());  //打印2,3,4,同樣存在誤差!
                  }
              });
    
  • skipLast:跳過最后的n項數據或一定時間內的數據

      Observable.just(1, 2, 3, 4)
              .skipLast(2)    //跳過最后2項
              .subscribe(new Action1<Integer>() {
                  @Override
                  public void call(Integer integer) {
                      Log.d("debug", integer.toString());     //打印1,2
                  }
              });
    
      Observable.interval(1, TimeUnit.SECONDS)
              .take(7)
              .skipLast(3, TimeUnit.SECONDS)   //跳過最后3秒
              .subscribe(new Action1<Long>() {
                  @Override
                  public void call(Long aLong) {
                      Log.d("debug", aLong.toString());  //打印0,1,2,同樣存在誤差!
                  }
              });
    
  • elementAt / elementAtOrDefault:發射某一項數據,其中elementAtOrDefault可以指定索引越界時發射的默認值

      Observable.just(1, 2, 3, 4)
              .elementAt(2)   //發射索引為2的數據
              .subscribe(new Action1<Integer>() {
                  @Override
                  public void call(Integer integer) {
                      Log.d("debug", integer.toString()); //打印3
                  }
              });
    
      Observable.just(1, 2, 3)
              .elementAtOrDefault(4, 5)   //發射索引為4的數據,索引越界時發射默認數據5
              .subscribe(new Action1<Integer>() {
                  @Override
                  public void call(Integer integer) {
                      Log.d("debug", integer.toString()); //打印5
                  }
              });
    
  • ignoreElements:丟棄所有數據,只發射錯誤或正常終止的通知,即只觸發觀察者的onError()或onCompleted()方法

  • distinct:過濾重復數據,可指定判定唯一的標準

      Observable.just(1, 1, 2, 3, 2, 4)
              .distinct()
              .subscribe(new Action1<Integer>() {
                  @Override
                  public void call(Integer integer) {
                      Log.d("debug", integer.toString()); //打印1,2,3,4
                  }
              });
    
      Observable.just(1, 1, 2, 3, 2, 4)
              //根據發射的數據生成對應的key,通過key值來判斷唯一,如果兩個數據的key相同,則只發射第一個
              .distinct(new Func1<Integer, Integer>() {   
                  @Override
                  public Integer call(Integer integer) {
                      //奇數對應的key為1,偶數對應的key為2
                      if (integer % 2 == 0) {
                          return 2;
                      }
                      return 1;
                  }
              })
              .subscribe(new Action1<Integer>() {
                  @Override
                  public void call(Integer integer) {
                      Log.d("debug", integer.toString()); //打印1,2
                  }
              });
    
  • distinctUntilChanged:過濾掉連續重復的數據,可指定判定唯一的標準

      Observable.just(1, 1, 2, 3, 2, 4)
              .distinctUntilChanged()
              .subscribe(new Action1<Integer>() {
                  @Override
                  public void call(Integer integer) {
                      Log.d("debug", integer.toString()); //打印1,2,3,2,4
                  }
              });
    
      Observable.just(1, 1, 2, 3, 2, 4)
              //根據發射的數據生成對應的key,通過key值來判斷唯一,如果兩個數據的key相同,則只發射第一個
              .distinctUntilChanged(new Func1<Integer, Integer>() {
                  @Override
                  public Integer call(Integer integer) {
                      //奇數對應的key為1,偶數對應的key為2
                      if (integer % 2 == 0) {
                          return 2;
                      }
                      return 1;
                  }
              })
              .subscribe(new Action1<Integer>() {
                  @Override
                  public void call(Integer integer) {
                      Log.d("debug", integer.toString()); //打印1,2,3,2
                  }
              });
    
      Observable.just(1, 1, 2, 3, 2, 4)
              //傳入比較器的方式
              .distinctUntilChanged(new Func2<Integer, Integer, Boolean>() {
                  @Override
                  public Boolean call(Integer integer, Integer integer2) {
                      return integer % 2 == integer2 % 2; //同為奇數或偶數返回true
                  }
              })
              .subscribe(new Action1<Integer>() {
                  @Override
                  public void call(Integer integer) {
                      Log.d("debug", integer.toString()); //打印1,2,3,2
                  }
              });
    
  • throttleFirst:定期發射Observable在該時間段發射的第一項數據

      Observable.interval(0, 500, TimeUnit.MILLISECONDS)
              .take(10)   //每500毫秒發射一次數據,發射10次
              .throttleFirst(1000, TimeUnit.MILLISECONDS) //每1秒發射該秒內發射數據中的第一項數據
              .subscribe(new Action1<Long>() {
                  @Override
                  public void call(Long aLong) {
                      //打印0,2,5,8(即第一秒發射0,1,第二秒發射2,3,4,第三秒發射5,6,7,第四秒發射8,9),同樣存在誤差!
                      Log.d("debug", aLong.toString());   
                  }
              });
    
  • throttleWithTimeout / debounce(兩者使用及效果相同):發射數據時,如果兩次數據的發射間隔小于指定時間,就會丟棄前一次的數據,直到指定時間內都沒有新數據發射時才進行發射

      Observable.create(new Observable.OnSubscribe<Integer>() {
          @Override
          public void call(Subscriber<? super Integer> subscriber) {  //依次發射1-6,發射間隔不同
              subscriber.onNext(1);
              SystemClock.sleep(500);
              subscriber.onNext(2);
              SystemClock.sleep(500);
              subscriber.onNext(3);
              SystemClock.sleep(1000);
              subscriber.onNext(4);
              SystemClock.sleep(1000);
              subscriber.onNext(5);
              SystemClock.sleep(500);
              subscriber.onNext(6);
              subscriber.onCompleted();
          }
      }).throttleWithTimeout(700, TimeUnit.MILLISECONDS)  //指定最小發射間隔時間為700毫秒
              .subscribe(new Action1<Integer>() {
                  @Override
                  public void call(Integer integer) {
                      Log.d("debug", integer.toString()); //打印3,4,6
                  }
              });
    
  • sample / throttleLast(兩者使用及效果相同):定期發射Observable在該時間段發射的最后一項數據,與throttleFirst相反

      Observable.interval(0, 500, TimeUnit.MILLISECONDS)
              .take(10)   //每500毫秒發射一次數據,發射10次
              .throttleLast(1000, TimeUnit.MILLISECONDS) //每1秒發射該秒內發射數據中的最后一項數據
              .subscribe(new Action1<Long>() {
                  @Override
                  public void call(Long aLong) {
                      //打印1,3,5,7,9(即第一秒發射0,1,第二秒發射2,3,第三秒發射4,5,第四秒發射6,7,第五秒發射8,9)
                      Log.d("debug", aLong.toString());
                  }
              });
    
  • timeout:如果指定時間內沒有發射任何數據,就發射一個異?;蛘呤褂脗溆玫腛bservavle

      Observable.timer(5, TimeUnit.SECONDS)
              .timeout(3, TimeUnit.SECONDS)   //超時則發射異常
              .subscribe(new Subscriber<Long>() {
                  @Override
                  public void onCompleted() {
                  }
    
                  @Override
                  public void onError(Throwable e) {
                      Log.d("debug", "onError()");    //拋出異常
                  }
    
                  @Override
                  public void onNext(Long aLong) {
                      Log.d("debug", aLong.toString());
                  }
              });
    
      Observable.timer(5, TimeUnit.SECONDS)
              .timeout(3, TimeUnit.SECONDS, Observable.just(2L))  //設置備用Observable
              .subscribe(new Subscriber<Long>() {
                  @Override
                  public void onCompleted() {
    
                  }
    
                  @Override
                  public void onError(Throwable e) {
                      Log.d("debug", "onError()");
                  }
    
                  @Override
                  public void onNext(Long aLong) {
                      Log.d("debug", aLong.toString());   //發射備用Observable,打印2
                  }
              });
    

條件 / 布爾操作

  • all:判斷所有數據中是否都滿足某個條件

      Observable.just(1, 2, 3, 4)
              .all(new Func1<Integer, Boolean>() {
                  @Override
                  public Boolean call(Integer integer) {
                      return integer < 5;//所有項都小于5
                  }
              })
              .subscribe(new Action1<Boolean>() {
                  @Override
                  public void call(Boolean aBoolean) {
                      Log.d("debug", aBoolean.toString());    //打印true
                  }
              });
    
      Observable.just(1, 2, 3, 4)
              .all(new Func1<Integer, Boolean>() {
                  @Override
                  public Boolean call(Integer integer) {
                      return integer > 2;//所有項都大于2
                  }
              })
              .subscribe(new Action1<Boolean>() {
                  @Override
                  public void call(Boolean aBoolean) {
                      Log.d("debug", aBoolean.toString());    //打印false
                  }
              });
    
  • exists:判斷是否存在數據項滿足某個條件

      Observable.just(1, 2, 3, 4)
              .exists(new Func1<Integer, Boolean>() {
                  @Override
                  public Boolean call(Integer integer) {
                      return integer > 2; //存在某項大于2
                  }   
              })
              .subscribe(new Action1<Boolean>() {
                  @Override
                  public void call(Boolean aBoolean) {
                      Log.d("debug", aBoolean.toString());    //打印true
                  }
              });
    
  • contains:判斷所有數據中是否包含指定的數據(內部調用exists)

      Observable.just(1, 2, 3, 4)
              .contains(2)    //是否包含2
              .subscribe(new Action1<Boolean>() {
                  @Override
                  public void call(Boolean aBoolean) {
                      Log.d("debug", aBoolean.toString());    //打印true
                  }
              });
    
  • sequenceEqual:判斷兩個Observable發射的數據是否相同(數據,發射順序,終止狀態)

      Observable.sequenceEqual(Observable.just(1, 2, 3), Observable.just(1, 2, 3))
              .subscribe(new Action1<Boolean>() {
                  @Override
                  public void call(Boolean aBoolean) {
                      Log.d("debug", aBoolean.toString());    //打印true
                  }
              });
    
  • isEmpty:用于判斷Observable是否沒有發射任何數據(發射null返回為false)

      Observable.from(new ArrayList<Integer>())  //集合中沒有數據
              .isEmpty()
              .subscribe(new Action1<Boolean>() {
                  @Override
                  public void call(Boolean aBoolean) {
                      Log.d("debug", aBoolean.toString());    //打印true
                  }
              });
    
      Observable.empty()
              .isEmpty()
              .subscribe(new Action1<Boolean>() {
                  @Override
                  public void call(Boolean aBoolean) {
                      Log.d("debug", aBoolean.toString());    //打印true
                  }
              });
    
  • amber:指定多個Observable,只允許第一個開始發射數據的Observable發射全部數據,其他Observable將會被會忽略

      Observable<Integer> observable1 = Observable.create(new Observable.OnSubscribe<Integer>() {
          @Override
          public void call(Subscriber<? super Integer> subscriber) {
              SystemClock.sleep(500);     //延遲500毫秒
              subscriber.onNext(1);
              subscriber.onNext(2);
              subscriber.onCompleted();
          }
      }.subscribeOn(Schedulers.computation()));  //指定為新的線程
    
      Observable<String> observable2 = Observable.create(new Observable.OnSubscribe<String>() {
          @Override
          public void call(Subscriber<? super String> subscriber) {
              subscriber.onNext("a");
              subscriber.onNext("b");
              subscriber.onCompleted();
          }
      });
    
      Observable.amb(observable1, observable2)
              .subscribe(new Action1<Serializable>() {
                  @Override
                  public void call(Serializable serializable) {
                      Log.d("debug", serializable.toString());    //打印a,b
                  }
              });
    
  • switchIfEmpty:如果原始Observable正常終止后仍沒有發射任何數據,就使用備用的Observable

      Observable.from(new ArrayList<Integer>())
              .switchIfEmpty(Observable.just(1, 2))
              .subscribe(new Action1<Integer>() {
                  @Override
                  public void call(Integer integer) {
                      Log.d("debug", integer.toString()); //打印1,2
                  }
              });
    
  • defaultIfEmpty:如果原始Observable正常終止后仍沒有發射任何數據,就發射一個默認值(內部調用switchIfEmpty)

      Observable.from(new ArrayList<Integer>())
              .defaultIfEmpty(1)
              .subscribe(new Action1<Integer>() {
                  @Override
                  public void call(Integer integer) {
                      Log.d("debug", integer.toString()); //打印1
                  }
              });
    
  • takeUntil:當發射的數據滿足某個條件后(包含該數據),或者第二個Observable發射了一項數據或發射了一個終止通知時(觀察者接受不到第二個Observable發射的數據),終止第一個Observable發送數據

      Observable.just(1, 2, 3, 4)
              .takeUntil(new Func1<Integer, Boolean>() {
                  @Override
                  public Boolean call(Integer integer) {
                      return integer == 3;
                  }
              })
              .subscribe(new Action1<Integer>() {
                  @Override
                  public void call(Integer integer) {
                      Log.d("debug", "just" + integer.toString());     //打印1,2,3
                  }
              });
    
      Observable.interval(0, 500, TimeUnit.MILLISECONDS)
              .subscribeOn(Schedulers.computation())
              .takeUntil(Observable.timer(1200, TimeUnit.MILLISECONDS))
              .subscribe(new Action1<Long>() {
                  @Override
                  public void call(Long aLong) {
                      Log.d("debug", aLong.toString());   //打印0,1,2
                  }
              });
    
  • takeWhile:當發射的數據對應某個條件為false時(不包含該數據),Observable終止發送數據

      Observable.just(1, 2, 3, 4)
              .takeWhile(new Func1<Integer, Boolean>() {
                  @Override
                  public Boolean call(Integer integer) {
                      return integer != 3;
                  }
              })
              .subscribe(new Action1<Integer>() {
                  @Override
                  public void call(Integer integer) {
                      Log.d("debug", integer.toString());     //打印1,2
                  }
              });
    
  • skipUnit:丟棄Observable發射的數據,直到第二個Observable開始發射數據或者發射一個終止通知時

      Observable.interval(0, 500, TimeUnit.MILLISECONDS)
              .take(5)
              .subscribeOn(Schedulers.computation())
              .skipUntil(Observable.timer(1200, TimeUnit.MILLISECONDS))
              .subscribe(new Action1<Long>() {
                  @Override
                  public void call(Long aLong) {
                      Log.d("debug", aLong.toString());   //打印3,4
                  }
              });
    
  • skipWhile:丟棄Observable發射的數據,直到一個指定的條件不成立(不丟棄條件數據)

      Observable.just(1, 2, 3, 4)
              .skipWhile(new Func1<Integer, Boolean>() {
                  @Override
                  public Boolean call(Integer integer) {
                      return integer < 3;
                  }
              })
              .subscribe(new Action1<Integer>() {
                  @Override
                  public void call(Integer integer) {
                      Log.d("debug", integer.toString());     //打印3,4
                  }
              });
    

聚合操作

  • reduce:用一個函數接收Observable發射的數據,將函數的計算結果作為下次計算的參數,最后輸出結果。

      Observable.just(1, 2, 3, 4)
              .reduce(new Func2<Integer, Integer, Integer>() {
                  @Override
                  public Integer call(Integer integer, Integer integer2) {
                      Log.d("debug", "integer1:" + integer + ",integer2:" + integer2);
                      return integer + integer2;  //求和操作
                  }
              })
              .subscribe(new Action1<Integer>() {
                  @Override
                  public void call(Integer integer) {
                      Log.d("debug", "result:" + integer);
                  }
              });
      /**
       * 日志輸出
       * integer1:1,integer2:2
       * integer1:3,integer2:3
       * integer1:6,integer2:4
       * result:10
       */
    
  • collect:用于將數據收集到一個可變的數據結構(如List,Map)

      Observable.just(1, 2, 3, 4)
              .collect(new Func0<List<Integer>>() {
                  @Override
                  public List<Integer> call() {
                      return new ArrayList<Integer>();    //創建List用于收集數據
                  }
              }, new Action2<List<Integer>, Integer>() {
                  @Override
                  public void call(List<Integer> integers, Integer integer) {
                      integers.add(integer);  //將數據添加到List中
                  }
              })
              .subscribe(new Action1<List<Integer>>() {
                  @Override
                  public void call(List<Integer> integers) {
                      Log.d("debug", integers.toString());    //打印[1, 2, 3, 4]
                  }
              });
    
      Observable.just(1, 2, 3, 4)
              .collect(new Func0<Map<Integer, String>>() {
                  @Override
                  public Map<Integer, String> call() {
                      return new HashMap<Integer, String>();  //創建Map用于收集數據
                  }
              }, new Action2<Map<Integer, String>, Integer>() {
                  @Override
                  public void call(Map<Integer, String> integerStringMap, Integer integer) {
                      integerStringMap.put(integer, "value" + integer);   //將數據添加到Map中
                  }
              })
              .subscribe(new Action1<Map<Integer, String>>() {
                  @Override
                  public void call(Map<Integer, String> integerStringMap) {
                      //打印{4=value4, 1=value1, 3=value3, 2=value2},注:HashMap保存的數據是無序的
                      Log.d("debug", integerStringMap.toString());    
                  }
              });
    
  • count / countLong:計算發射的數量,內部調用的是reduce

      Observable.just(1, 2, 3, 4)
              .count()
              .subscribe(new Action1<Integer>() {
                  @Override
                  public void call(Integer integer) {
                      Log.d("debug", "integer:" + integer.toString());    //打印4
                  }
              });
    

轉換操作

  • toList:將Observable發射的所有數據收集到一個列表中,返回這個列表

      Observable.just(1, 2, 3, 4)
              .toList()
              .subscribe(new Action1<List<Integer>>() {
                  @Override
                  public void call(List<Integer> integers) {
                      Log.d("debug", integers.toString());    //打印[1, 2, 3, 4]
                  }
              });
    
  • toSortedList:將Observable發射的所有數據收集到一個有序列表中,返回這個列表

      Observable.just(3, 2, 5, 4, 1)
              .toSortedList()     //默認升序排序
              .subscribe(new Action1<List<Integer>>() {
                  @Override
                  public void call(List<Integer> integers) {
                      Log.d("debug", integers.toString());    //打印[1, 2, 3, 4, 5]
                  }
              });
    
      Observable.just(3, 2, 5, 4, 1)
              .toSortedList(new Func2<Integer, Integer, Integer>() {
                  @Override
                  public Integer call(Integer integer, Integer integer2) {
                      return integer2 - integer;  //自定義排序規則(倒序)
                  }
              })
              .subscribe(new Action1<List<Integer>>() {
                  @Override
                  public void call(List<Integer> integers) {
                      Log.d("debug", integers.toString());    //打印[5, 4, 3, 2, 1]
                  }
              });
    
  • toMap:將序列數據轉換為一個Map,根據數據項生成key和value

      Observable.just(1, 2, 3, 4)
              .toMap(new Func1<Integer, String>() {   //根據數據項生成key,value為原始數據
                  @Override
                  public String call(Integer integer) {
                      return "key:" + integer;
                  }
              })
              .subscribe(new Action1<Map<String, Integer>>() {
                  @Override
                  public void call(Map<String, Integer> stringIntegerMap) {
                      Log.d("debug", stringIntegerMap.toString());    //打印{key:4=4, key:2=2, key:1=1, key:3=3}
                  }
              });
    
      Observable.just(1, 2, 3, 4)
              .toMap(new Func1<Integer, String>() {   //根據數據項生成key和value
                  @Override
                  public String call(Integer integer) {
                      return "key:" + integer;
                  }
              }, new Func1<Integer, String>() {
                  @Override
                  public String call(Integer integer) {
                      return "value:" + integer;
                  }
              })
              .subscribe(new Action1<Map<String, String>>() {
                  @Override
                  public void call(Map<String, String> stringStringMap) {
                      Log.d("debug", stringStringMap.toString()); //打印{key:4=value:4, key:2=value:2, key:1=value:1, key:3=value:3}
                  }
              });
    
      Observable.just(1, 2, 3, 4)
              .toMap(new Func1<Integer, String>() {   //根據數據項生成key和value,創建指定類型的Map
                  @Override
                  public String call(Integer integer) {
                      return "key:" + integer;
                  }
              }, new Func1<Integer, String>() {
                  @Override
                  public String call(Integer integer) {
                      return "value:" + integer;
                  }
              }, new Func0<Map<String, String>>() {
                  @Override
                  public Map<String, String> call() {
                      return new LinkedHashMap<String, String>(); //LinkedHashMap保證存取順序相同
                  }
              })
              .subscribe(new Action1<Map<String, String>>() {
                  @Override
                  public void call(Map<String, String> stringStringMap) {
                      Log.d("debug", stringStringMap.toString());  //打印{key:1=value:1, key:2=value:2, key:3=value:3, key:4=value:4}
                  }
              });
    
  • toMultiMap:類似toMap,不同的地方在于map的value是一個集合,使一個key可以映射多個value,多用于分組

      Observable.just(1, 2, 1, 4)
              .toMultimap(new Func1<Integer, String>() {   //根據數據項生成key,value為原始數據
                  @Override
                  public String call(Integer integer) {
                      return "key:" + integer;
                  }
              })
              .subscribe(new Action1<Map<String, Collection<Integer>>>() {
                  @Override
                  public void call(Map<String, Collection<Integer>> stringCollectionMap) {
                      Log.d("debug", stringCollectionMap.toString()); //打印{key:4=[4], key:2=[2], key:1=[1, 1]}
                  }
              });
    
      Observable.just(1, 2, 1, 4)
              .toMap(new Func1<Integer, String>() {
                  @Override
                  public String call(Integer integer) {
                      return "key:" + integer;
                  }
              })
              .subscribe(new Action1<Map<String, Integer>>() {
                  @Override
                  public void call(Map<String, Integer> stringIntegerMap) {
                      Log.d("debug", stringIntegerMap.toString());    //打印{key:4=4, key:2=2, key:1=1}
                  }
              });
    

變換操作

  • map:對Observable發射的每一項數據都應用一個函數進行變換

      Observable.just(1, 2, 3, 4)
              .map(new Func1<Integer, String>() {
                  @Override
                  public String call(Integer integer) {
                      return "item:" + integer;
                  }
              })
              .subscribe(new Action1<String>() {
                  @Override
                  public void call(String s) {
                      Log.d("debug", s);  //打印item:1,item:2,item:3,item:4
                  }
              });
    
  • cast:在發射之前強制將Observable發射的所有數據轉換為指定類型(父類強轉為子類)

      List list = new ArrayList();
      Observable.just(list)
              .cast(ArrayList.class)  //將List強轉為ArrayList
              .subscribe(new Action1<ArrayList>() {
                  @Override
                  public void call(ArrayList arrayList) {
    
                  }
              });
    
  • flatMap:將Observable發射的數據變換為Observables集合,然后將這些Observable發射的數據平坦化的放進一個單獨的Observable,內部使用marge合并(可用于一對多轉換或多對多轉換,也可用于網絡請求的嵌套)

      Observable.just(1, 2, 3)
              .flatMap(new Func1<Integer, Observable<Integer>>() {
                  @Override
                  public Observable<Integer> call(Integer integer) {
                      return Observable.create(new Observable.OnSubscribe<Integer>() {
                          @Override
                          public void call(Subscriber<? super Integer> subscriber) {
                              subscriber.onNext(integer * 10);
                              subscriber.onNext(integer * 100);
                              subscriber.onCompleted();
                          }
                      });
                  }
              })
              .subscribe(new Action1<Integer>() {
                  @Override
                  public void call(Integer integer) {
                      Log.d("debug", integer.toString()); //打印10,100,20,200,30,300
                  }
              });
    
  • flatMapIterable:和flatMap作用一樣,只不過生成的是Iterable而不是Observable

      Observable.just(1, 2, 3)
              .flatMapIterable(new Func1<Integer, Iterable<Integer>>() {
                  @Override
                  public Iterable<Integer> call(Integer integer) {
                      return Arrays.asList(integer * 10, integer * 100);
                  }
              })
              .subscribe(new Action1<Integer>() {
                  @Override
                  public void call(Integer integer) {
                      Log.d("debug", integer.toString()); //打印10,100,20,200,30,300
                  }
              });
    
  • concatMap:類似于flatMap,由于內部使用concat合并,所以是按照順序連接發射

  • switchMap:和flatMap很像,將Observable發射的數據變換為Observables集合,當原始Observable發射一個新的數據(Observable)時,它將取消訂閱前一個Observable

      Observable.interval(0, 500, TimeUnit.MILLISECONDS)  //每500毫秒發射一次
              .take(4)
              .switchMap(new Func1<Long, Observable<String>>() {
                  @Override
                  public Observable<String> call(Long aLong) {
                      return Observable.create(new Observable.OnSubscribe<String>() {
                          @Override
                          public void call(Subscriber<? super String> subscriber) {
                              subscriber.onNext(aLong + "A");
                              SystemClock.sleep(800);     //延遲800毫秒
                              subscriber.onNext(aLong + "B");
                              subscriber.onCompleted();
                          }
                      }).subscribeOn(Schedulers.newThread());
                  }
              })
              .subscribe(new Action1<String>() {
                  @Override
                  public void call(String s) {
                      Log.d("debug", s);  //打印0A,1A,2A,3A,3B
                  }
              });
    
  • 與reduce很像,對Observable發射的每一項數據應用一個函數,然后按順序依次發射每一個值

      Observable.just(1, 2, 3, 4)
              .scan(new Func2<Integer, Integer, Integer>() {
                  @Override
                  public Integer call(Integer integer, Integer integer2) {
                      Log.d("debug", "integer1:" + integer + ",integer2:" + integer2);
                      return integer + integer2;
                  }
              })
              .subscribe(new Action1<Integer>() {
                  @Override
                  public void call(Integer integer) {
                      Log.d("debug", "result:" + integer);
                  }
              });
      /**
       * 日志輸出
       * result:1
       * integer1:1,integer2:2
       * result:3
       * integer1:3,integer2:3
       * result:6
       * integer1:6,integer2:4
       * result:10
       */
    
  • groupBy:將Observable分拆為Observable集合,將原始Observable發射的數據按Key分組,每個Observable發射一組不同的數據(類似于toMultiMap)

      Observable.just(1, 2, 3, 4)
              .groupBy(new Func1<Integer, String>() {
                  @Override
                  public String call(Integer integer) {   //根據數據項生成key
                      return integer % 2 == 0 ? "偶數" : "奇數";
                  }
              })
              .subscribe(new Action1<GroupedObservable<String, Integer>>() {
                  @Override
                  public void call(GroupedObservable<String, Integer> o) {
                      o.subscribe(new Action1<Integer>() {
                          @Override
                          public void call(Integer integer) {
                              Log.d("debug", o.getKey() + ":" + integer); //打印奇數:1,偶數:2,奇數:3,偶數:4
                          }
                      });
                  }
              });
    
      Observable.just(1, 2, 3, 4)
              .groupBy(new Func1<Integer, String>() {
                  @Override
                  public String call(Integer integer) {   //根據數據項生成key
                      return integer % 2 == 0 ? "偶數" : "奇數";
                  }
              }, new Func1<Integer, Integer>() {
                  @Override
                  public Integer call(Integer integer) {  //根據數據項生成value
                      return integer * 10;
                  }
              })
              .subscribe(new Action1<GroupedObservable<String, Integer>>() {
                  @Override
                  public void call(GroupedObservable<String, Integer> o) {
                      o.subscribe(new Action1<Integer>() {
                          @Override
                          public void call(Integer integer) {
                              Log.d("debug", o.getKey() + ":" + integer); //打印奇數:10,偶數:20,奇數:30,偶數:40
                          }
                      });
                  }
              });
    
  • buffer:定期從Observable收集數據到一個集合,然后將這些數據集合打包發射

      Observable.just(1, 2, 3, 4, 5)
              .buffer(3, 1)   //count:表示從當前指針位置開始打包3個數據項到集合中,skip:表示指針向后移1位,
              .subscribe(new Action1<List<Integer>>() {
                  @Override
                  public void call(List<Integer> integers) {
                      Log.d("debug", "skip" + integers.toString());   //打印[1, 2, 3],[2, 3, 4],[3, 4, 5],[4, 5],[5]
                  }
              });
    
      Observable.just(1, 2, 3, 4, 5)
              .buffer(3)  //每3個打包成一個集合,內部就是.buffer(3,3)
              .subscribe(new Action1<List<Integer>>() {
                  @Override
                  public void call(List<Integer> integers) {
                      Log.d("debug", integers.toString());    //打印[1, 2, 3],[4, 5]
                  }
              });
    
      Observable.interval(0, 100, TimeUnit.MILLISECONDS)
              .take(5)
              .buffer(250, TimeUnit.MILLISECONDS, 2)     //將每250毫秒內發射的數據收集到多個集合中,每個集合最多存放2個數據
              .subscribe(new Action1<List<Long>>() {
                  @Override
                  public void call(List<Long> longs) {
                      //打印[0, 1],[2],[3, 4],[]
                      Log.d("debug", "count:" + longs.toString());
                  }
              });
    
      Observable.interval(0, 100, TimeUnit.MILLISECONDS)
              .take(5)
              .buffer(250, TimeUnit.MILLISECONDS)     //將每250毫秒內發射的數據收集到一個集合中,集合不限制大小
              .subscribe(new Action1<List<Long>>() {
                  @Override
                  public void call(List<Long> longs) {
                      Log.d("debug", longs.toString());   //打印[0, 1, 2],[3, 4]
                  }
              });
    
      Observable.interval(0, 100, TimeUnit.MILLISECONDS)
              .take(5)
              //從指定時間節點開始,將該節點后250毫秒內發射的數據收集的一個集合中,初始節點為0,每發射一次集合,
              //節點的時間增加150毫秒,即下一次收集數據從150毫秒開始,收集150毫秒到400毫秒之間發射的數據
              .buffer(250, 150, TimeUnit.MILLISECONDS)     
              .subscribe(new Action1<List<Long>>() {
                  @Override
                  public void call(List<Long> longs) {
                      Log.d("debug", longs.toString());   //打印[0, 1, 2],[2,3],[4]
                  }
              });
    
  • window:定期將來自Observable的數據分拆成一些Observable窗口,然后發射這些窗口,而不是每次發射一項,類似于buffer,buffer發射的是集合,而window發射的是Observable

      Observable.just(1, 2, 3, 4, 5)
              .window(3, 1)
              .subscribe(new Action1<Observable<Integer>>() {
                  @Override
                  public void call(Observable<Integer> integerObservable) {
                      integerObservable.toList()  //將所有數據搜集成一個集合,便于觀察
                              .subscribe(new Action1<List<Integer>>() {
                                  @Override
                                  public void call(List<Integer> integers) {
                                      Log.d("debug", integers.toString());    //打印[1, 2, 3],[2, 3, 4],[3, 4, 5],[4, 5],[5]
                                  }
                              });
                  }
              });
    
      Observable.just(1, 2, 3, 4, 5)
              .window(3)  //相當于window(3,3)
              .subscribe(new Action1<Observable<Integer>>() {
                  @Override
                  public void call(Observable<Integer> integerObservable) {
                      integerObservable.toList()  //將所有數據搜集成一個集合,便于觀察
                              .subscribe(new Action1<List<Integer>>() {
                                  @Override
                                  public void call(List<Integer> integers) {
                                      Log.d("debug", integers.toString());    //打印[1, 2, 3],[4, 5]
                                  }
                              });
                  }
              });
      //剩下其余重載方法也與buffer基本一樣,不重復了
    

篇幅有限,第一部分介紹到這里

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,197評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,415評論 3 415
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,104評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,884評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,647評論 6 408
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,130評論 1 323
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,208評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,366評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,887評論 1 334
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,737評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,939評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,478評論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,174評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,586評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,827評論 1 283
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,608評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,914評論 2 372

推薦閱讀更多精彩內容

  • 注:只包含標準包中的操作符,用于個人學習及備忘參考博客:http://blog.csdn.net/maplejaw...
    小白要超神閱讀 949評論 0 3
  • 作者: maplejaw本篇只解析標準包中的操作符。對于擴展包,由于使用率較低,如有需求,請讀者自行查閱文檔。 創...
    maplejaw_閱讀 45,730評論 8 93
  • 創建unfaseCreate(create)創建一個Observable(被觀察者),當被觀察者(Observer...
    chuwe1閱讀 7,020評論 3 8
  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,781評論 18 139
  • 最近看了一個貼子,一個白領用月租1600,租下了廣州芳村的一套60平米的兩房一廳,花了三萬多塊錢裝修。當她下了班便...
    素錦之年閱讀 246評論 0 1