RxJava_04のテクニック徹底解説【データ送信フィルタリング動作】

黄舟
リリース: 2017-03-04 09:49:10
オリジナル
1540 人が閲覧しました

このチュートリアルは、RxJava1 に基づいた包括的な説明です。データのさらなるフィルタリングが必要になる場合があります。次のチュートリアルでは、ほとんどのフィルタリング操作の関数について説明します。
Distinct - 送信された重複データを削除します

    Filter - 条件に基づいて特定のデータをフィルタリングします
  1. First - 送信キューの最初のデータを取得します
  2. Last - 送信キューの最後のデータを取得しますデータの一部
  3. ElementAt - インデックスに基づいてキュー内の特定のデータを送信します
  4. Take - キュー内のデータの最初の n 項目を取得します
  5. TakeLast - データの最後の n 項目を取得しますキュー
  6. Sample - 送信時間に従ってサンプリングして送信します
  7. IgnoreElements - 送信データキューを無視します
  8. 1.Distinct
  9. これでクラスがあり、生徒の情報が入力されました学生制度。同じデータが繰り返されていることが判明しました。生徒のデータ キューは次のとおりです:

    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;
    }
    ログイン後にコピー
  10. 現在の必要性は、重複した名前を持つオブジェクトをインターセプトすることです。そして、それを出力します:
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

渡されたデータの繰り返し部分をフィルタリングすることに加えて、フィルタを使用してルールに従って特定のデータをクリアすることもできます。

次のコードで送信されるデータは 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.");
            }
        });
ログイン後にコピー

Output

Next: 1
Next: 2
Next: 3
Sequence complete.
ログイン後にコピー

3. まず、この関数を呼び出して許可します。最初の項目のみが送信される送信データキュー。

サンプルコード

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.");
    }
});
ログイン後にコピー

Output

Next: 1
Sequence complete.
ログイン後にコピー

同様の関数には、firstOrDefault() が含まれます。この関数は、キュー送信プロセス中にデフォルト値、つまり最初の項目が見つからない場合に送信します。値が送信されます。

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.");
    }
});
ログイン後にコピー
Output

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);
        }
    });
ログイン後にコピー

Output

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.");
            }
        });
ログイン後にコピー

Output

Next: 1
Next: 2
Next: 3
Next: 4
Sequence complete.
ログイン後にコピー

7.TakeLast

元のObservableを変更するには、TakeLastオペレータを使用します。以前のデータは無視され、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 中国語 Web サイト (www.php.cn) に注目してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート