Now the payoff: the iterator vocabulary that turns ten-line imperative loops into one declarative chain. These are the patterns you'll reach for daily once they're in your fingers.
collect: build a collection
collect consumes an iterator into a collection — a Vec, a String, a HashMap, whatever you annotate. It's the universal 'turn this pipeline back into data' operation. A type annotation on the binding, or the turbofish collect::<Vec<_>>(), tells it what to build.
enumerate, zip, chain
enumerate pairs each item with its index — the right way to get an index without a manual counter. zip walks two iterators in lockstep into pairs. chain concatenates two iterators end to end. Together they replace a whole category of fiddly index manipulation.
let mut i = 0; for x in &v { ...; i += 1; }, write for (i, x) in v.iter().enumerate(). No counter to forget to increment, no off-by-one, and the intent is explicit. It's the single most common iterator cleanup clippy suggests.fold: the general reducer
fold(initial, |acc, item| ...) threads an accumulator through every element — sum, product, building a string, computing a max are all folds. When no specialized consumer fits, fold is the general tool. Understanding it means you can express almost any aggregation as one expression.
This is idiomatic Rust
Reaching for an iterator chain before a manual loop is one of the clearest markers of fluent Rust. The chains are declarative, bug-resistant (no index math), and zero-cost. When you catch yourself writing let mut result = vec![]; for ... { result.push(...) }, ask whether map+collect says it more clearly.