Reduce
применяет функцию к каждому элементу, испускаемому Observable, последовательно, и испускает конечное значение
Оператор Reduce применяет функцию к первому элементу, испускаемому исходным Observable, а затем передает результат функции вместе со вторым элементом, испускаемым исходным Observable, продолжая этот процесс до тех пор, пока исходное Observable не испустит свой последний элемент и не завершит работу, после чего Observable, возвращаемый оператором Reduce, испускает конечное значение, возвращённое функцией.
Этот тип операции иногда называют «накоплением», «агрегированием», «сжатием», «свертыванием» или «инъекцией» в других контекстах.
См. также
Информация, специфичная для языка
RxGroovy collect 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.
- Javadoc:
reduce(Func2)
Также есть версия reduce, в которую вы можете передать начальное значение помимо функции аккумулятора. Обратите внимание, что передача начального значения не то же самое, что его отсутствие. Поведение будет отличаться. Если вы передадите начальное значение null, вы будете использовать элемент null в качестве начального для своего сокращения. Также обратите внимание, что если вы передадите начальное значение, и исходное Observable не испустит никаких элементов, reduce испустит начальное значение и завершится нормально без ошибок.
reduce по умолчанию не работает с каким-либо конкретным Scheduler.
- Javadoc:
reduce(R,Func2)
Не рекомендуется использовать reduce для сбора испускаемых элементов в изменяемую структуру данных. Используйте collect для этой цели.
Оператор collect похож на reduce, но специализируется на сборе всего набора элементов, испускаемых исходным Observable, в одну изменяемую структуру данных, которая будет испущена результирующим Observable. Передайте ему два параметра:
- функция, которая возвращает изменяемую структуру данных
- функция, которая, когда получает структуру данных и элемент, испущенный исходным Observable, модифицирует структуру данных соответствующим образом
collect по умолчанию не работает с каким-либо конкретным Scheduler.
- Javadoc:
collect(Func0,Action2)
RxJava 1․x collect reduce
Оператор reduce возвращает Observable, который применяет функцию по вашему выбору к первому элементу, испускаемому исходным Observable, затем подаёт результат этой функции вместе со вторым элементом, испускаемым исходным Observable, в ту же функцию, затем подаёт результат этой функции вместе с третьим элементом в ту же функцию и так далее, пока все элементы не будут испущены исходным Observable. Затем он испускает окончательный результат последнего вызова вашей функции в качестве единственного результата возвращаемого Observable.
Обратите внимание, что если исходное Observable не испускает никаких элементов, reduce завершится с ошибкой IllegalArgumentException.
reduce по умолчанию не работает на каком-либо конкретном расписании.
- Javadoc:
reduce(Func2)
Также существует версия reduce, в которую вы можете передать начальное значение помимо функции накопления. Обратите внимание, что передача начального значения не равносильна тому, что начальное значение не передаётся. Поведение будет отличаться. Если вы передадите начальное значение null, вы инициализируете своё сокращение элементом null. Также обратите внимание, что если вы передадите начальное значение, а исходное Observable не испустит никаких элементов, reduce испустит начальное значение и завершится нормально без ошибок.
reduce по умолчанию не работает на каком-либо конкретном расписании.
- Javadoc:
reduce(R,Func2)
Не рекомендуется использовать reduce для сбора испускаемых элементов в изменяемую структуру данных. Вместо этого используйте collect для этой цели.
Оператор collect похож на reduce, но специализируется на сборе всего набора элементов, испущенных исходным Observable, в одну изменяемую структуру данных для испускания результативным Observable. Передайте ему два параметра:
- функцию, возвращающую изменяемую структуру данных
- функцию, которая, получив структуру данных и элемент, испущенный исходным Observable, должным образом изменяет структуру данных
collect по умолчанию не работает на каком-либо конкретном расписании.
- Javadoc:
collect(Func0,Action2)
RxJS 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.jsrx.all.compat.jsrx.aggregates.js
Для reduce требуется один из следующих дистрибутивов:
rx.jsrx.compat.jsrx.lite.jsrx.lite.compat.js
RxPHP reduce
RxPHP реализует этот оператор как reduce.
Применяет функцию накопления к последовательности observable, возвращая результат агрегации как единственный элемент в последовательности результатов. Указанное начальное значение используется в качестве начального значения накопления.
Пример кода
//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!
© ReactiveX contributors
Licensed under the Apache License 2.0.
http://reactivex.io/documentation/operators/reduce.html