Elixir Language
Courant
Recherche…
Remarques
Les flux sont composables, énumérables paresseux.
En raison de leur paresse, les flux sont utiles lorsque vous travaillez avec des collections volumineuses (voire infinies). Lors du chaînage de nombreuses opérations avec Enum
, des listes intermédiaires sont créées, tandis que Stream
crée une recette de calculs exécutés ultérieurement.
Enchaînement de plusieurs opérations
Stream
est particulièrement utile lorsque vous souhaitez exécuter plusieurs opérations sur une collection. C'est parce que Stream
est paresseux et ne fait qu'une seule itération (alors Enum
ferait plusieurs itérations, par exemple).
numbers = 1..100
|> Stream.map(fn(x) -> x * 2 end)
|> Stream.filter(fn(x) -> rem(x, 2) == 0 end)
|> Stream.take_every(3)
|> Enum.to_list
[2, 8, 14, 20, 26, 32, 38, 44, 50, 56, 62, 68, 74, 80, 86, 92, 98, 104, 110,
116, 122, 128, 134, 140, 146, 152, 158, 164, 170, 176, 182, 188, 194, 200]
Ici, nous avons chaîné 3 opérations ( map
, filter
et take_every
), mais l'itération finale n'a été effectuée qu'après l' Enum.to_list
de Enum.to_list
.
Ce que fait Stream
interne, c’est qu’il attend l’évaluation réelle. Avant cela, il crée une liste de toutes les fonctions, mais une fois que l'évaluation est nécessaire, elle parcourt la collection une fois, exécutant toutes les fonctions sur chaque élément. Cela le rend plus efficace que Enum
, qui dans ce cas ferait 3 itérations, par exemple.