Filter (篩選)

只發射 Observable 中通過謂詞測試的項目

Filter 運算子透過只允許通過你以謂詞函式形式指定的測試的項目,來篩選 Observable。

參見

各語言特定資訊

待定

filter

RxGroovy 將此運算子實作為 filter。你可以透過將一個篩選函式傳入 filter 運算子來篩選 Observable,丟棄任何不符合某些測試的項目。例如,以下程式碼篩選一個整數列表,只發射偶數(也就是,除以二的餘數為零的數字)

範例程式碼

numbers = Observable.from([1, 2, 3, 4, 5, 6, 7, 8, 9]);

numbers.filter({ 0 == (it % 2) }).subscribe(
  { println(it); },                          // onNext
  { println("Error: " + it.getMessage()); }, // onError
  { println("Sequence complete"); }          // onCompleted
);
2
4
6
8
Sequence complete

filter 預設不會在任何特定的 Scheduler 上運作。

ofType

在 RxGroovy 中還有一個 Filter 運算子的特殊形式,可以篩選 Observable,使其僅發射特定類別的項目。

ofType 預設不會在任何特定的 Scheduler 上運作。

filter

RxJava 將此運算子實作為 filter

範例程式碼

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.

filter 預設不會在任何特定的 Scheduler 上運作。

ofType

在 RxJava 中還有一個 Filter 運算子的特殊形式,可以篩選 Observable,使其僅發射特定類別的項目。

ofType 預設不會在任何特定的 Scheduler 上運作。

filter

RxJS 以兩個名稱實作此運算子,但行為完全相同:filterwhere。此運算子接受兩個參數:謂詞函式,以及一個可選的物件,該物件將在執行時代表該函式的「this」上下文。

謂詞函式本身接受三個參數

  1. 要篩選或不篩選的來源 Observable 中的項目
  2. 此項目在來源 Observable 序列中從零開始的索引
  3. 來源 Observable 物件

編寫謂詞函式,使其對於您想要通過篩選器傳遞到下一個觀察者的項目返回 true,對於您希望篩選器阻止和抑制的項目返回 false

範例程式碼

var source = Rx.Observable.range(0, 5)
  .filter(function (x, idx, obs) {
    return x % 2 === 0;
  });

var subscription = source.subscribe(
  function (x) { console.log('Next: %s', x); },
  function (err) { console.log('Error: %s', err); },
  function () { console.log('Completed'); });
Next: 0
Next: 2
Next: 4
Completed

filterwhere 在以下每個發行版中都有

  • rx.js
  • rx.all.js
  • rx.all.compat.js
  • rx.compat.js
  • rx.lite.js
  • rx.lite.compat.js

RxPHP 將此運算子實作為 filter

只發射 Observable 中通過謂詞測試的項目。

範例程式碼

//from https://github.com/ReactiveX/RxPHP/blob/master/demo/filter/filter.php

$observable = Rx\Observable::fromArray([21, 42, 84]);
$observable
    ->filter(function ($elem) {
        return $elem >= 42;
    })
    ->subscribe($stdoutObserver);

   
Next value: 42
Next value: 84
Complete!
    

RxPHP 也有一個運算子 where

filter 的別名