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. |