Start here. This is the direct spoken answer to practice first.
Why this question matters
Materialization is an ownership and execution boundary, not merely a convenient way to change the sequence's type.
I materialize when I need a stable snapshot, repeated access, indexing, a count, or independence from the source lifetime. I keep a sequence lazy when consumers can process it once and incremental execution reduces work or memory. Materializing also fixes when exceptions and side effects happen, because the upstream sequence executes at that point.