RxJava使用(三)操作符

Map操作符

Map操作符,是將獲取到的數據類型進行轉換的一個操作符。他可以將具體從網絡端或者其他地方獲取到的數據,通過自己編寫的方法進行轉化成任何你需要的數據類型並返回,交給相應的方法去處理。

 Observable.create(new ObservableOnSubscribe<String>() {
           @Override
           public void subscribe(ObservableEmitter<String> e) throws Exception {
               e.onNext("1");
               e.onNext("2");
               e.onNext("3");
           }
       }).map(new Function<String, Integer>() {
           @Override
           public Integer apply(String s) throws Exception {
               return Integer.parseInt(s);
           }
       }).subscribe(new Consumer<Integer>() {
                   @Override
                   public void accept(Integer integer) throws Exception {
                       Log.i("result",integer + "");     
                   }
               });

這裏看到,我們在上游的發射器中發射了三個字符串數字,'1','2','3'。然後通過Map這個操作符將三個數字轉化爲int類型的數,最後打印出來。

具體應用

我們在進行網絡請求的時候,如果後臺返回來了一串json字符串,我們可以在Map操作符中定義一個方法,通過Gson或者FastJson將json字符串轉化成爲相應的數據bean類型,然後返回給下游,之後我們就可以方便的操作這些對象的set、get方法了。

我們先定義一個json字符串來模擬從網絡端獲取的數據

{
  "name":"Tome",
  "age":"15",
  "sex":"man"
}

然後根據這個json寫一個類Perosn

public class Person {

    /**
     * name : Tome
     * age : 15
     * sex : man
     */

    private String name;
    private String age;
    private String sex;

    public void setName(String name) {
        this.name = name;
    }

    public void setAge(String age) {
        this.age = age;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public String getName() {
        return name;
    }

    public String getAge() {
        return age;
    }

    public String getSex() {
        return sex;
    }
}

最後我們使用RxJava的Map操作符來處理這個請求

Observable.create(new ObservableOnSubscribe<String>() {
          @Override
          public void subscribe(ObservableEmitter<String> e) throws Exception {
              e.onNext(json);
          }
      }).map(new Function<String, Person>() {
          @Override
          public Person apply(String s) throws Exception {
              Gson gson = new Gson();

              return gson.fromJson(json, Person.class);
          }
      }).subscribe(new Consumer<Person>() {
          @Override
          public void accept(Person person) throws Exception {
              Log.i("result",person.getName());
              Log.i("result",person.getAge());
              Log.i("result",person.getSex());
          }
      });

我們看到我們在上游用onNext()方法發射了這個json字符串,然後在中間用map方法通過Gson解析將json字符串解析成爲我們之前定義的那個Person類,最後在下游接收到這個類型之後log打印出來相應的數據,我們便完成了所有的操作。是不是特別方便?

其實通過這個我們還可以對一個Url圖片進行出處理,通過拿到這個圖片的Url,將其轉換成爲Bitmap然後返回,之後我們直接將這個Bitmap set到相應的位置上即可。

flatMap操作符

flatMap操作符是將獲取到的一個元素變化成多個元素之後,通過Observable再次發射出去,之後再由下游進行接收處理。

例如我們在從網絡端獲取到一個json字符串之後,裏面有個對象是個集合對象,我們可以先獲取到這個對象,之後再將這個集合對象發射出去,從而直接在下游拿到這個對象操作它,達到我們的目的。

說白了,Map操作符他的操作是一對一的操作,一次只能操作一個對象,處理完成之後也是返回一個對象,但是FlatMap操作符卻不同,它一次可以操作多個對象,他的對應關係爲一對多或者多對多。 在FlatMap的內部,其實是還有一個Observable發射器,當我們將數據處理完成只有,再由一個內部的發射器將這些數據發射出去,從而達到我們一對多或者多對多的目的。

這裏需要注意,flatMap對於數據的操作和發射並不是順序的,而是隨機處理的,所以你發射出去的數據可能經過flatMap之後數據的順序會發生改變,如果我們不想讓數據順序發生改變,我們可以使用concatMap操作符

filter操作符

顧名思義,過濾操作符。我們可以將獲取到的數據進行一次條件過濾,從而獲取到我們想要的數據

Observable.just(1,2,3,4,5,6,7)
               .filter(new Predicate<Integer>() {
                   @Override
                   public boolean test(Integer integer) throws Exception {

                       return integer > 5 ;
                   }
               })
               .subscribe(new Consumer<Integer>() {
                   @Override
                   public void accept(Integer integer) throws Exception {
                       Log.i("result:",integer + "");
                   }
               });

上面我們將小於5的數據進行了過濾,從而獲取到了6,7這兩個數字。

interval

輪詢操作符。我們可以通過這個操作符來指定一段時間進行輪詢操作。我們可以用來他寫一個倒計時的計數器。

privat int time = 60;

Observable.create(new ObservableOnSubscribe<Integer>() {
           @Override
           public void subscribe(ObservableEmitter<Integer> e) throws Exception {
               if (time > 0){
                   e.onNext(time -- );
               }else {
                   e.onComplete();
               }
           }
       }).interval(1,TimeUnit.SECONDS)
               .subscribe(new Consumer<Long>() {
                   @Override
                   public void accept(Long aLong) throws Exception {

                   }
               });

我們在這裏寫一個定時器,規定每隔一秒鐘發射一個數據,並且這個變量每次發射完成之後都自減一,一旦減到零,便停止發射。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章