首頁  >  文章  >  Java  >  深入淺出RxJava_04[資料傳輸過濾操作]的技巧

深入淺出RxJava_04[資料傳輸過濾操作]的技巧

黄舟
黄舟原創
2017-03-04 09:49:101535瀏覽

本教學基於RxJava1.x版本進行全面講解,後續課程將陸續更新,敬請關注…

# #在被觀察者發送資料給觀察者的時候,在資料傳輸的時候,有可能需要對資料進一步過濾。以下的教學攬括了大部分過濾操作的函數。

  1. Distinct - 去掉重複發送的資料

  2. #Filter - 根據條件過濾特定的資料

  3. First - 取發送佇列中的第一個資料

  4. Last - 取發送佇列中的最後一個資料

  5. ##ElementAt - 根據索引發送佇列中的特定資料
  6. Take - 取得佇列中的前n項資料
  7. ##TakeLast - 取得佇列中的後n項數據
  8. Sample - 根據發送的資料透過發送時間採樣發送
  9. #IgnoreElements - 忽略發送的資料佇列
  10. 1.Distinct
現在有一個班級,學生的資訊都已經輸入到學生系統了。結果發現有相同的數據重複了。學生資料隊列如下:

private ArrayList<Student> initPersons() {
    ArrayList<Student> persons = new ArrayList<>();
    persons.add(new Student("张三", 16));
    persons.add(new Student("李四", 17));
    persons.add(new Student("王二麻子", 18));
    persons.add(new Student("张三", 22));
    return persons;
}

現在的需求就是,將重複名字的物件攔截掉。並列印出來:

Observable
    .from(initPersons())
    //过滤重复名字的项
    .distinct(new Func1<Student, String>() {
        @Override
        public String call(Student student) {
            return student.name;
        }
    })
    .subscribe(new Action1<Student>() {
        @Override
        public void call(Student student) {
            Log.i(TAG, "call: "+student);
        }
    });

輸出如下:

IT520: call: Student{name=&#39;张三&#39;, age=16}
IT520: call: Student{name=&#39;李四&#39;, age=17}
IT520: call: Student{name=&#39;王二麻子&#39;, age=18}

2.Filter

上面除了可以將傳遞資料的重複部分過濾掉,還可以透過filter根據規則清除特定的數據。

下面的程式碼發送的資料是12345,定義過濾的規則是資料吧必須小於4,範例程式碼如下:

Observable.just(1, 2, 3, 4, 5)
      .filter(new Func1<Integer, Boolean>() {
          @Override
          public Boolean call(Integer item) {
            return( item < 4 );
          }
      })
      .subscribe(new Subscriber<Integer>() {
            @Override
            public void onNext(Integer item) {
                System.out.println("Next: " + item);
            }

            @Override
            public void onError(Throwable error) {
                System.err.println("Error: " + error.getMessage());
            }

            @Override
            public void onCompleted() {
                System.out.println("Sequence complete.");
            }
        });

輸出

Next: 1
Next: 2
Next: 3
Sequence complete.

3.First

呼叫了該函數可以讓傳送的資料佇列只傳送第一項。

範例程式碼

Observable.just(1, 2, 3)
      .first()
      .subscribe(new Subscriber<Integer>() {
    @Override
    public void onNext(Integer item) {
        System.out.println("Next: " + item);
    }

    @Override
    public void onError(Throwable error) {
        System.err.println("Error: " + error.getMessage());
    }

    @Override
    public void onCompleted() {
        System.out.println("Sequence complete.");
    }
});

輸出

Next: 1
Sequence complete.

類似的函數還有firstOrDefault(),該函數在佇列發送的過程如果隊列為null,也就是找不到第一項,則會傳送一個預設值。

4.Last

呼叫了該函數可以讓傳送的資料佇列只傳送最後一項。

範例程式碼

Observable.just(1, 2, 3)
      .last()
      .subscribe(new Subscriber<Integer>() {
    @Override
    public void onNext(Integer item) {
        System.out.println("Next: " + item);
    }

    @Override
    public void onError(Throwable error) {
        System.err.println("Error: " + error.getMessage());
    }

    @Override
    public void onCompleted() {
        System.out.println("Sequence complete.");
    }
});

輸出

Next: 3
Sequence complete.

類似的函數還有lastOrDefault(T)

5.ElementAt

#ElementAt操作符取得原始Observable發射的資料序列指定索引位置的資料項,然後當做自己的唯一資料發射。

如果你傳遞的是負數,或是原始Observable的資料項數小於index+1,將會拋出一個IndexOutOfBoundsException例外。

範例程式碼如下:

Observable.just(1, 2, 3, 4, 1, 4)
    .elementAt(3)
    .subscribe(new Action1<Integer>() {
        @Override
        public void call(Integer value) {
            Log.i(TAG, "call: " + value);
        }
    });

輸出

com.m520it.rxjava I/IT520: call: 4

6.Take

使用Take運算子讓你可以修改Observable的行為,只回傳前面的N項數據,然後發射完成通知,忽略剩餘的數據。

範例程式碼

Observable.just(1, 2, 3, 4, 5, 6, 7, 8)
      .take(4)
      .subscribe(new Subscriber<Integer>() {
            @Override
            public void onNext(Integer item) {
                System.out.println("Next: " + item);
            }

            @Override
            public void onError(Throwable error) {
                System.err.println("Error: " + error.getMessage());
            }

            @Override
            public void onCompleted() {
                System.out.println("Sequence complete.");
            }
        });

輸出

Next: 1
Next: 2
Next: 3
Next: 4
Sequence complete.

7.TakeLast

使用TakeLast運算元修改原始Observable,你可以只發射Observable'發射的後N項數據,忽略前面的數據。

範例程式碼

Observable.just(1, 2, 3, 4, 5, 6, 7, 8)
      .takeLast(4)
      .subscribe(new Subscriber<Integer>() {
            @Override
            public void onNext(Integer item) {
                System.out.println("Next: " + item);
            }

            @Override
            public void onError(Throwable error) {
                System.err.println("Error: " + error.getMessage());
            }

            @Override
            public void onCompleted() {
                System.out.println("Sequence complete.");
            }
        });

輸出

Next: 5
Next: 6
Next: 7
Next: 8
Sequence complete.

8.Sample

對發送的資料進行一定頻率的取樣發送

Observable
        .interval(1000, TimeUnit.MILLISECONDS)//每秒发送1个数字
        .sample(2000,TimeUnit.MILLISECONDS)//每2秒采样一次
        .subscribe(new Action1<Long>() {
            @Override
            public void call(Long aLong) {
                Log.i(TAG, "call: "+aLong);
            }
        });

上面的代碼列印:0,2,4,6,8。 。 。 。

9.IgnoreElements

如果你不關心一個Observable發射的數據,但是希望在它完成時或遇到錯誤終止時收到通知,你可以對Observable使用ignoreElements操作符,它會確保永遠不會呼叫觀察者的onNext()方法。

Observable.just(1, 2, 3, 4, 1)
            .ignoreElements()//不发送任何信息 直接发送onCompleted()
            .subscribe(new Subscriber<Integer>() {
                @Override
                public void onCompleted() {
                    Log.i(TAG, "onCompleted: ");
                }

                @Override
                public void onError(Throwable e) {

                }

                @Override
                public void onNext(Integer integer) {
                    Log.i(TAG, "onNext: "+integer);
                }
            });

 以上就是深入淺出RxJava_04[資料傳輸過濾操作]的技巧的內容,更多相關內容請關注PHP中文網(www.php.cn)!


#
陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn