Spec-Zone.ru › RethinkDB java

Команда ReQL: fold

Синтаксис команды

sequence.fold(base, function) → value
sequence.fold(base, function).optArg("emit", function)[.optArg("final_emit", function)] → sequence

Описание

Применяет функцию к последовательности в порядке следования, сохраняя состояние через накопитель. Команда fold возвращает либо одно значение, либо новую последовательность.

В первом варианте fold работает как reduce, возвращая значение путём применения объединяющей функции к каждому элементу в последовательности. Объединяющая функция принимает два параметра: предыдущий результат сокращения (накопитель) и текущий элемент. Однако, fold имеет следующие отличия от reduce:

  • гарантируется, что будет пройдена вся последовательность от первого элемента до последнего.
  • функции передаётся начальное базовое значение с первым элементом вместо предыдущего результата сокращения.
combiningFunction(accumulator | base, element) → newAccumulator

Во втором варианте, fold работает как concat_map, возвращая новую последовательность вместо одного значения. Когда предоставляется emit функция, fold будет:

  • проходить по последовательности в порядке и принимать начальное базовое значение, как и выше.
  • для каждого элемента в последовательности вызывать как объединяющую функцию, так и отдельную функцию вывода. Функция вывода принимает три параметра: предыдущий результат сокращения (накопитель), текущий элемент и результат объединяющей функции (новое значение накопителя).

Если предоставлена функция вывода, она должна возвращать список.

emit(previousAccumulator, element, accumulator) → array

Также может быть предоставлена finalEmit функция, которая будет вызвана в конце последовательности. Она принимает один параметр: результат последнего сокращения через итерацию (накопитель) или исходное базовое значение, если входная последовательность была пустой. Эта функция должна возвращать список, который будет добавлен в выходной поток fold.

finalEmit(accumulator | base) → array

Пример: Объединить слова из списка.

r.table("words").orderBy("id").fold("",
    (acc, word) -> acc.add(r.branch(r.eq(acc, ""), "", ", ")).add(word)
).run(conn);

(Этот пример можно реализовать с помощью reduce, но fold сохранит порядок, когда words является таблицей RethinkDB или другим потоком, что не гарантируется при использовании reduce.)

Пример: Возвратить каждую вторую строку в таблице.

r.table("even_things").fold(0,
    (acc, row) -> r.add(acc, 1)
).optArg("emit",
    (acc, row, new_acc) -> r.branch(r.mod(new_acc, 2).eq(0),
                                    r.array(row), r.array())
).run(conn);

Первая функция увеличивает накопитель каждый раз при вызове, начиная с 0; вторая функция, функция вывода, чередует возвращение списка, содержащего текущую строку, или пустого списка. Команда fold вернёт объединённый список каждого выведенного значения.

Пример: Вычисление средневзвешенной пятидневной прибыли для трекера веса.

r.table("tracker").filter(
    r.hashMap("name", "bob")
).orderBy("date").g("weight").fold(r.array(),
    (acc, row) -> r.add(r.array(row), acc).limit(5)
).optArg("emit",
    (acc, row, new_acc) -> r.branch(new_acc.size().eq(5),
                                    r.array(new_acc.avg()),
                                    r.array())
).run(conn);

Связанные команды

  • reduce
  • concatMap

© RethinkDB contributors
Licensed under the Creative Commons Attribution-ShareAlike 3.0 Unported License.
https://rethinkdb.com/api/java/fold/

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API