Reduce

將一個函式依序應用到 Observable 發出的每個項目,並發出最終值

Reduce 操作符會將一個函式應用到源 Observable 發出的第一個項目,然後將該函式的結果與源 Observable 發出的第二個項目一起回饋到該函式中,以此類推,直到源 Observable 發出最後一個項目並完成,此時從 Reduce 返回的 Observable 會發出從該函式返回的最終值。

這種操作在其他情境中,有時被稱為「累加」、「聚合」、「壓縮」、「摺疊」或「注入」。

另請參閱

特定語言資訊

reduce

reduce 操作符返回一個 Observable,它將您選擇的函式應用於源 Observable 發出的第一個項目,然後將該函式的結果與源 Observable 發出的第二個項目一起回饋到同一個函式中,然後將該函式的結果與第三個項目一起回饋到同一個函式中,以此類推,直到源 Observable 發出所有項目。然後,它會將最後一次調用函式的最終結果,作為返回的 Observable 的唯一輸出發出。

請注意,如果源 Observable 沒有發出任何項目,則 reduce 將會失敗,並拋出 IllegalArgumentException

例如,以下程式碼使用 reduce 來計算,然後以 Observable 的形式發出,源 Observable 發出的數字總和

範例程式碼

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

numbers.reduce({ a, b -> a+b }).subscribe(
  { println(it); },                          // onNext
  { println("Error: " + it.getMessage()); }, // onError
  { println("Sequence complete"); }          // onCompleted
);
15
Sequence complete

reduce 預設不會在任何特定的 Scheduler 上運行。

reduce

還有一個版本的 reduce,除了累加器函式之外,您還可以傳遞一個種子項目。請注意,傳遞 null 種子與不傳遞種子是不同的。行為會有所不同。如果您傳遞 null 作為種子,您將會以項目 null 作為還原的種子。另請注意,如果您確實傳遞了一個種子,並且源 Observable 沒有發出任何項目,則 reduce 將會發出該種子,並正常完成而不會出現錯誤。

reduce 預設不會在任何特定的 Scheduler 上運行。

使用 reduce 來將發出的項目收集到可變資料結構中是不好的做法。相反,請使用 collect 來達到此目的。

collect

collect 操作符與 reduce 類似,但專門用於將源 Observable 發出的所有項目,收集到一個單一的可變資料結構中,以便由產生的 Observable 發出。請將兩個參數傳遞給它

  1. 一個返回可變資料結構的函式
  2. 一個函式,當給定資料結構和源 Observable 發出的項目時,會適當修改該資料結構

collect 預設不會在任何特定的 Scheduler 上運行。

reduce

reduce 操作符返回一個 Observable,它將您選擇的函式應用於源 Observable 發出的第一個項目,然後將該函式的結果與源 Observable 發出的第二個項目一起回饋到同一個函式中,然後將該函式的結果與第三個項目一起回饋到同一個函式中,以此類推,直到源 Observable 發出所有項目。然後,它會將最後一次調用函式的最終結果,作為返回的 Observable 的唯一輸出發出。

請注意,如果源 Observable 沒有發出任何項目,則 reduce 將會失敗,並拋出 IllegalArgumentException

reduce 預設不會在任何特定的 Scheduler 上運行。

reduce

還有一個版本的 reduce,除了累加器函式之外,您還可以傳遞一個種子項目。請注意,傳遞 null 種子與不傳遞種子是不同的。行為會有所不同。如果您傳遞 null 作為種子,您將會以項目 null 作為還原的種子。另請注意,如果您確實傳遞了一個種子,並且源 Observable 沒有發出任何項目,則 reduce 將會發出該種子,並正常完成而不會出現錯誤。

reduce 預設不會在任何特定的 Scheduler 上運行。

使用 reduce 來將發出的項目收集到可變資料結構中是不好的做法。相反,請使用 collect 來達到此目的。

collect

collect 操作符與 reduce 類似,但專門用於將源 Observable 發出的所有項目,收集到一個單一的可變資料結構中,以便由產生的 Observable 發出。請將兩個參數傳遞給它

  1. 一個返回可變資料結構的函式
  2. 一個函式,當給定資料結構和源 Observable 發出的項目時,會適當修改該資料結構

collect 預設不會在任何特定的 Scheduler 上運行。

reduce

RxJS 實作了 reduce 操作符。請將一個累加器函式傳遞給它,並且可選地,傳遞一個種子值,以便與源 Observable 發出的第一個項目一起傳遞到累加器函式中。

範例程式碼

var source = Rx.Observable.range(1, 3)
    .reduce(function (acc, x) {
        return acc * x;
    }, 1)

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

reduce 位於以下每個發行版本中

  • rx.all.js
  • rx.all.compat.js
  • rx.aggregates.js

reduce 需要以下其中一個發行版本

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

RxPHP 將此操作符實作為 reduce

將累加器函式應用於一個可觀察序列,並將聚合的結果作為結果序列中的單一元素返回。指定的種子值用作初始累加器值。

範例程式碼

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

//Without a seed
$source = \Rx\Observable::fromArray(range(1, 3));

$subscription = $source
    ->reduce(function ($acc, $x) {
        return $acc + $x;
    })
    ->subscribe($createStdoutObserver());

   
Next value: 6
Complete!
    
//from https://github.com/ReactiveX/RxPHP/blob/master/demo/reduce/reduce-with-seed.php

//With a seed
$source = \Rx\Observable::fromArray(range(1, 3));

$subscription = $source
    ->reduce(function ($acc, $x) {
        return $acc * $x;
    }, 1)
    ->subscribe($createStdoutObserver());

   
Next value: 6
Complete!
    

待定