Учебники

Эликсир — Потоки

Многие функции ожидают перечисления и возвращают список обратно. Это означает, что при выполнении нескольких операций с Enum каждая операция будет генерировать промежуточный список, пока мы не достигнем результата.

Потоки поддерживают ленивые операции, а не активные операции перечислений. Короче говоря, потоки являются ленивыми, компонуемыми перечислимыми . Это означает, что Streams не выполняет операцию, если она не является абсолютно необходимой. Давайте рассмотрим пример, чтобы понять это —

Live Demo

odd? = &(rem(&1, 2) != 0)
res = 1..100_000 |> Stream.map(&(&1 * 3)) |> Stream.filter(odd?) |> Enum.sum
IO.puts(res)

Когда вышеуказанная программа запущена, она дает следующий результат —

7500000000

В приведенном выше примере 1..100_000 |> Stream.map (& (& 1 * 3)) возвращает тип данных, фактический поток, который представляет вычисление карты в диапазоне 1..100_000. Он еще не оценил это представление. Вместо создания промежуточных списков потоки создают серию вычислений, которые вызываются только тогда, когда мы передаем основной поток в модуль Enum. Потоки полезны при работе с большими, возможно бесконечными, коллекциями.

Потоки и перечисления имеют много общих функций. Потоки в основном предоставляют те же функции, которые предоставляет модуль Enum, который генерирует списки в качестве возвращаемых значений после выполнения вычислений для входных перечислимых элементов. Некоторые из них перечислены в следующей таблице —

кусок (перечисление, n, шаг, остаток \\ nil)

Потоки перечислимых в чанках, содержащих по n элементов каждый, где каждый новый чанк запускает пошаговые элементы в перечислимых.

CONCAT (перечислимых)

Создает поток, который перечисляет каждое перечисляемое в перечисляемом.

каждый (перечисление, веселье)

Выполняет данную функцию для каждого элемента.

фильтр (перечисление, веселье)

Создает поток, который фильтрует элементы в соответствии с заданной функцией при перечислении.

карта (перечисление, веселье)

Создает поток, который будет применять данную функцию при перечислении.

drop (enum, n)

Лениво выбрасывает следующие n предметов из перечисленного.