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.



Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow