Elixir - Streams

Muitas funções esperam um enumerável e retornam um listde volta. Isso significa que, ao realizar várias operações com Enum, cada operação irá gerar uma lista intermediária até chegarmos ao resultado.

Streams oferecem suporte a operações lazy em oposição a operações ansiosas por enums. Em resumo,streams are lazy, composable enumerables. Isso significa que o Streams não executa uma operação a menos que seja absolutamente necessário. Vamos considerar um exemplo para entender isso -

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

Quando o programa acima é executado, ele produz o seguinte resultado -

7500000000

No exemplo dado acima, 1..100_000 |> Stream.map(&(&1 * 3))retorna um tipo de dados, um fluxo real, que representa a computação do mapa no intervalo 1..100_000. Ainda não avaliou esta representação. Em vez de gerar listas intermediárias, os fluxos criam uma série de cálculos que são invocados apenas quando passamos o fluxo subjacente para o módulo Enum. Os fluxos são úteis ao trabalhar com coleções grandes, possivelmente infinitas.

Streams e enums têm muitas funções em comum. Streams fornecem principalmente as mesmas funções fornecidas pelo módulo Enum que gerou Lists como seus valores de retorno após realizar cálculos em enumeráveis ​​de entrada. Alguns deles estão listados na tabela a seguir -

Sr. Não. Função e sua descrição
1

chunk(enum, n, step, leftover \\ nil)

Transmite o enumerável em blocos, contendo n itens cada, onde cada novo bloco inicia os elementos da etapa no enumerável.

2

concat(enumerables)

Cria um fluxo que enumera cada enumerável em um enumerável.

3

each(enum, fun)

Executa a função fornecida para cada item.

4

filter(enum, fun)

Cria um fluxo que filtra os elementos de acordo com a função fornecida na enumeração.

5

map(enum, fun)

Cria um fluxo que aplicará a função dada na enumeração.

6

drop(enum, n)

Descarta preguiçosamente os próximos n itens do enumerável.