Ленивые вычисления с модулем Stream
Эффективно обрабатывайте большие или бесконечные коллекции с помощью потоков Elixir, вычисляющих значения лениво, по мере необходимости.
«Ленивые вычисления с модулем Stream» — бесплатный урок Elixir & Phoenix: Scalable Backend Development на CoddyKit. Это урок 4 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Elixir & Phoenix: Scalable Backend Development, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Elixir & Phoenix: Scalable Backend Development содержит 4 уроков всего.
Части этого урока еще не переведены и отображаются на английском.
Eager vs Lazy
Enum is eager: each step builds a full intermediate list. Stream is lazy: it composes operations and computes only when needed.
The Cost of Eager Pipelines
Chaining several Enum calls walks the whole collection multiple times and allocates a list at each stage.
1..1_000_000
|> Enum.map(&(&1 * 2))
|> Enum.filter(&(rem(&1, 3) == 0))
|> Enum.take(5)
|> IO.inspect()Building a Stream
Swap Enum for Stream to defer work. Nothing runs until a consuming function is called.
stream =
1..1_000_000
|> Stream.map(&(&1 * 2))
|> Stream.filter(&(rem(&1, 3) == 0))
IO.inspect(stream)Forcing Evaluation
A stream stays inert until an Enum function (like take or to_list) pulls values through it.
result =
1..1_000_000
|> Stream.map(&(&1 * 2))
|> Enum.take(5)
IO.inspect(result)Why Streams Are Efficient
Lazy pipelines fuse the steps and stop as soon as enough elements are produced, avoiding huge intermediate lists.
Infinite Streams
Stream.iterate/2 creates endless sequences that are safe because evaluation is lazy.
Stream.iterate(0, &(&1 + 1))
|> Enum.take(5)
|> IO.inspect()Stream.cycle for Repetition
Stream.cycle repeats a finite list forever, useful for assigning rotating values.
Stream.cycle(["a", "b", "c"])
|> Enum.take(7)
|> IO.inspect()Generating with Stream.unfold
Stream.unfold/2 builds a stream from a state and a function returning the next value and new state.
Stream.unfold(1, fn n -> {n, n * 2} end)
|> Enum.take(5)
|> IO.inspect()Streaming Files Line by Line
File.stream!/1 reads a file lazily, one line at a time, so you can process huge files with constant memory.
# File.stream!("big.log")
# |> Stream.filter(&String.contains?(&1, "ERROR"))
# |> Enum.count()Stream.chunk_every
Group a stream into batches lazily, handy for paginating work without loading everything.
1..10
|> Stream.chunk_every(3)
|> Enum.to_list()
|> IO.inspect()When to Choose Stream
Use Stream for large datasets, multi-step pipelines, infinite sequences, or IO. Use Enum for small collections where simplicity wins.
Quick Check
Test your lazy evaluation knowledge.
Recap
You learned lazy evaluation:
Enumis eager;Streamis lazy and composable- Streams compute only when consumed by an
Enumfunction - They enable infinite sequences and constant-memory file processing
- Prefer streams for large/multi-step pipelines, Enum for small data
Часто задаваемые вопросы
Урок «Ленивые вычисления с модулем Stream» бесплатный?
Да — полный текст урока «Ленивые вычисления с модулем Stream» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Elixir & Phoenix: Scalable Backend Development, подпишись на CoddyKit PRO. Курс Elixir & Phoenix: Scalable Backend Development содержит 4 уроков всего.
Чему я научусь в уроке «Ленивые вычисления с модулем Stream»?
Эффективно обрабатывайте большие или бесконечные коллекции с помощью потоков Elixir, вычисляющих значения лениво, по мере необходимости. Ты практикуешь Elixir & Phoenix: Scalable Backend Development с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Elixir & Phoenix: Scalable Backend Development?
Предыдущий опыт не требуется. Elixir & Phoenix: Scalable Backend Development на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 4 из 4.
Сколько времени занимает урок «Ленивые вычисления с модулем Stream»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Elixir & Phoenix: Scalable Backend Development?
Да. Каждый урок Elixir & Phoenix: Scalable Backend Development включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Функции, модули и конвейерная обработка
- Работа с перечисляемыми коллекциями
- Рекурсия и функции высшего порядка
- Ленивые вычисления с модулем Stream