Поиск…


замечания

Потоки являются составными, ленивыми перечислениями.

Из-за их лени потоки полезны при работе с большими (или даже бесконечными) коллекциями. При объединении многих операций с 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 итерации, например.



Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow