Distinct

抑制 Observable 發射的重複項目

Distinct 運算子會過濾 Observable,只允許尚未發射的項目通過。

在某些實作中,有些變體允許您調整兩個項目被視為「不同」的標準。在某些實作中,有一個運算子的變體只會將項目與其直接前一個項目進行比較,以判斷是否不同,從而只過濾序列中*連續*的重複項目。

另請參閱

特定語言資訊

distinct

RxGroovy 將此運算子實作為 distinct

distinct

此運算子還有一個變體,它接受一個函式作為參數。此函式會對來源 Observable 發射的項目進行操作,以產生一個「鍵」。然後,distinct 會比較這些鍵,而不是項目本身,以判斷兩個項目是否不同。

distinctUntilChanged

RxGroovy 也實作了 distinctUntilChanged 運算子。它只會將來源 Observable 發射的項目與其直接前一個項目進行比較,以判斷它們是否不同。

distinctUntilChanged

distinct 一樣,distinctUntilChanged 也有一個版本接受鍵選擇器函式,並使用產生的鍵來判斷兩個相鄰發射的項目是否不同。

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

distinct

RxJava 將此運算子實作為 distinct

範例程式碼

Observable.just(1, 2, 1, 1, 2, 3)
          .distinct()
          .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.
distinct

此運算子還有一個變體,它接受一個函式作為參數。此函式會對來源 Observable 發射的項目進行操作,以產生一個「鍵」。然後,distinct 會比較這些鍵,而不是項目本身,以判斷兩個項目是否不同。

distinctUntilChanged

RxJava 也實作了 distinctUntilChanged 運算子。它只會將來源 Observable 發射的項目與其直接前一個項目進行比較,以判斷它們是否不同。

distinctUntilChanged

distinct 一樣,distinctUntilChanged 也有一個版本接受鍵選擇器函式,並使用產生的鍵來判斷兩個相鄰發射的項目是否不同。

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

distinct

在 RxJS 中,distinct 運算子有兩個可選參數

  1. 一個函式,它接受來源 Observable 發射的項目,並返回一個,該鍵將在比較兩個項目是否不同時使用,而不是項目本身
  2. 一個函式,它接受兩個項目(或兩個鍵)並比較它們是否不同,如果它們不同則返回 false(如果您不在此處提供自己的函式,則預設為相等函式)

範例程式碼

/* Without key selector */
var source = Rx.Observable.fromArray([
        42, 24, 42, 24
    ])
    .distinct();

var subscription = source.subscribe(
    function (x) { console.log('Next: ' + x.toString()); },
    function (err) { console.log('Error: ' + err); },
    function () { console.log('Completed'); });
Next: 42
Next: 24
Completed
/* With key selector */
var source = Rx.Observable.fromArray([
        {value: 42}, {value: 24}, {value: 42}, {value: 24}
    ])
    .distinct(function (x) { return x.value; });

var subscription = source.subscribe(
    function (x) {
        console.log('Next: ' + x.toString());
    },
    function (err) {
        console.log('Error: ' + err);
    },
    function () {
        console.log('Completed');
    });
Next: { value: 42 }
Next: { value: 24 }
Completed
distinctUntilChanged

RxJS 也有一個 distinctUntilChanged 運算子。它只會將來源 Observable 發射的項目與其直接前一個項目進行比較,以判斷它們是否不同。它採用與 distinct 運算子相同的兩個可選參數。

範例程式碼

/* Without key selector */
var source = Rx.Observable.fromArray([
        24, 42, 24, 24
    ])
    .distinctUntilChanged();

var subscription = source.subscribe(
    function (x) { console.log('Next: ' + x); },
    function (err) { console.log('Error: ' + err); },
    function () { console.log('Completed'); });
Next: 24
Next: 42
Next: 24
Completed
/* With key selector */
var source = Rx.Observable.fromArray([
        {value: 24}, {value: 42}, {value: 42}, {value: 24}
    ])
    .distinctUntilChanged(function (x) { return x.value; });

var subscription = source.subscribe(
    function (x) { console.log('Next: ' + x.toString()); },
    function (err) { console.log('Error: ' + err); },
    function () { console.log('Completed'); });
Next: { value: 24 }
Next: { value: 42 }
Next: { value: 24 }
Completed

distinctdistinctUntilChanged 在以下每個發行版本中都有找到

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

RxPHP 將此運算子實作為 distinct

根據 keySelector 和比較器,返回僅包含不同元素的 observable 序列。由於維護內部查找結構可能會變得很大,因此應謹慎考慮使用此運算子。

範例程式碼

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

$source = \Rx\Observable::fromArray([
    42, 24, 42, 24
])->distinct();

$subscription = $source->subscribe($stdoutObserver);

   
Next value: 42
Next value: 24
Complete!
    

RxPHP 也有一個運算子 distinctKey

採用鍵選擇器的 distinct 變體

範例程式碼

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

$source = \Rx\Observable::fromArray([
    ['id' => '42'],
    ['id' => '24'],
    ['id' => '42'],
    ['id' => '24']
])
    ->distinctKey(function ($x) {
        return $x['id'];
    })
    ->map(function ($x) {
        return $x['id'];
    });

$subscription = $source->subscribe($stdoutObserver);

   
Next value: 42
Next value: 24
Complete!
    

RxPHP 也有一個運算子 distinctUntilChanged

distinct 的變體,只會將來源 Observable 發射的項目與其直接前一個項目進行比較,以判斷它們是否不同。

範例程式碼

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

$source = \Rx\Observable::fromArray([
    24, 42, 24, 24
])->distinctUntilChanged();

$subscription = $source->subscribe($stdoutObserver);

   
Next value: 24
Next value: 42
Next value: 24
Complete!
    

RxPHP 也有一個運算子 distinctUntilKeyChanged

distinctUntilChanged 的變體,它採用鍵選擇器和比較器。

範例程式碼

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

$source = \Rx\Observable::fromArray([
    ['id' => '24'],
    ['id' => '42'],
    ['id' => '24'],
    ['id' => '24']
])
    ->distinctUntilKeyChanged(function ($x) {
        return $x['id'];
    })
    ->map(function ($x) {
        return $x['id'];
    });

$subscription = $source->subscribe($stdoutObserver);

   
Next value: 24
Next value: 42
Next value: 24
Complete!