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!
    

待定