Elixir Language
Поток
Поиск…
замечания
Потоки являются составными, ленивыми перечислениями.
Из-за их лени потоки полезны при работе с большими (или даже бесконечными) коллекциями. При объединении многих операций с Enum
создаются промежуточные списки, а Stream
создает рецепт вычислений, которые выполняются в более поздний момент.
Цепочка нескольких операций
Stream
особенно полезен, когда вы хотите запускать несколько операций в коллекции. Это связано с тем, что Stream
ленив и выполняет только одну итерацию (тогда как, например, Enum
несколько итераций).
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]
Здесь мы связали 3 операции ( map
, filter
и take_every
), но окончательная итерация была выполнена только после Enum.to_list
.
Что делает Stream
внутренне, так это то, что он ждет, пока не потребуется фактическая оценка. До этого он создает список всех функций, но после того, как оценка необходима, она проходит через коллекцию один раз, выполняя все функции для каждого элемента. Это делает его более эффективным, чем Enum
, который в этом случае будет делать 3 итерации, например.