Heim >Java >javaLernprogramm >Eine ausführliche Erläuterung der Techniken von RxJava_04 [Datenübertragungsfilterungsvorgang]

Eine ausführliche Erläuterung der Techniken von RxJava_04 [Datenübertragungsfilterungsvorgang]

黄舟
黄舟Original
2017-03-04 09:49:101550Durchsuche

Dieses Tutorial basiert auf RxJava1 >Wenn der Beobachter Daten an den Beobachter sendet, müssen die Daten möglicherweise während der Datenübertragung weiter gefiltert werden. Das folgende Tutorial behandelt Funktionen für die meisten Filtervorgänge.
Eindeutig – doppelt gesendete Daten entfernen

    Filter – spezifische Daten basierend auf Bedingungen filtern
  1. First – Holen Sie sich die ersten Daten in der Sendewarteschlange
  2. Last – Holen Sie sich die letzten Daten in der Sendewarteschlange
  3. ElementAt – Gemäß dem Index Spezifische Daten in der Warteschlange senden
  4. Take – Die ersten n Datenelemente in der Warteschlange abrufen
  5. TakeLast – Die letzten n Datenelemente in der Warteschlange abrufen Daten in der Warteschlange
  6. Sample – Senden durch Senden eines Zeitmusters basierend auf den gesendeten Daten
  7. IgnoreElements – Ignorieren Sie die gesendete Datenwarteschlange
  8. 1.Eindeutig
  9. Es gibt jetzt eine Klasse und die Informationen der Schüler wurden in das Schülersystem eingegeben. Es stellte sich heraus, dass dieselben Daten wiederholt wurden. Die Schülerdatenwarteschlange sieht wie folgt aus:

Der aktuelle Bedarf besteht darin, Objekte mit doppelten Namen abzufangen. Und drucken Sie es aus:

Die Ausgabe ist wie folgt:

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;
}

2.Filter

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);
        }
    });
Zusätzlich zum Herausfiltern der wiederholten Teile der übertragenen Daten Sie können auch den Filter „Bestimmte Daten basierend auf Regeln löschen“ verwenden.

Die vom folgenden Code gesendeten Daten sind 12345. Die Filterregel besagt, dass der Datenbalken kleiner als 4 sein muss. Der Beispielcode lautet wie folgt:
IT520: call: Student{name=&#39;张三&#39;, age=16}
IT520: call: Student{name=&#39;李四&#39;, age=17}
IT520: call: Student{name=&#39;王二麻子&#39;, age=18}

Ausgabe

3 .First

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.");
            }
        });
Durch den Aufruf dieser Funktion kann die Warteschlange für gesendete Daten nur das erste Element senden.

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

Ausgabe

Ähnliche Funktionen umfassen firstOrDefault(), das in die Warteschlange gesendet wird, wenn die Warteschlange null ist Das heißt, wenn das erste Element nicht gefunden wird, wird ein Standardwert gesendet.
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.");
    }
});

4.Last
Next: 1
Sequence complete.

Rufen Sie diese Funktion auf, um nur das letzte Element in der Warteschlange für gesendete Daten zu senden. Beispielcode

Ausgabe

Ähnliche Funktionen umfassen lastOrDefault(T)
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.");
    }
});

5
Next: 3
Sequence complete.

Der ElementAt-Operator ruft das Datenelement an der angegebenen Indexposition der vom ursprünglichen Observable ausgegebenen Datensequenz ab und gibt es dann als eigene eindeutige Daten aus. Wenn Sie eine negative Zahl übergeben oder die Anzahl der Datenelemente im ursprünglichen Observable kleiner als index+1 ist, wird eine IndexOutOfBoundsException ausgelöst.

Der Beispielcode lautet wie folgt:

Ausgabe

6.Take

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);
        }
    });
Mit dem Take-Operator können Sie die ändern Verhalten des Observable: Nur die ersten N Datenelemente werden zurückgegeben, dann wird die Abschlussbenachrichtigung ausgegeben und die verbleibenden Daten werden ignoriert.

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

Ausgabe

7.TakeLast

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.");
            }
        });
Verwenden Sie den TakeLast-Operator, um das ursprüngliche Observable zu ändern. Sie können es einfach ausgeben Die letzten N übertragenen Daten werden ignoriert. Die vorherigen Daten werden ignoriert.

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

Ausgabe

8.Sample

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.");
            }
        });
Sample die gesendeten Daten in einer bestimmten Häufigkeit

Next: 5
Next: 6
Next: 7
Next: 8
Sequence complete.
Der obige Code gibt aus: 0, 2, 4, 6, 8. . . .

9.IgnoreElements

Wenn Ihnen die von einem Observable ausgegebenen Daten egal sind, Sie aber benachrichtigt werden möchten, wenn es abgeschlossen wird oder mit einem Fehler endet, können Sie den Operator „ignoreElements“ verwenden Das Observable stellt sicher, dass die onNext()-Methode des Beobachters niemals aufgerufen wird.
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);
            }
        });

Das Obige ist eine ausführliche Einführung in die Techniken von RxJava_04 [Datenübertragungsfilterungsvorgang]. Weitere verwandte Inhalte finden Sie auf der chinesischen PHP-Website (www.php.cn)!

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);
                }
            });
Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn