The Iterator trait
Anything that implements `Iterator` exposes a stream of values. The trait has many provided methods — `map`, `filter`, `fold`, `collect` — that operate lazily by default.
Closures
Closures are anonymous functions that can capture their environment. Their type is inferred, and they can implement `Fn`, `FnMut`, or `FnOnce` depending on how they capture.
Lazy evaluation
Iterator chains do nothing until a terminal operation like `collect`, `for`, `sum`, or `count` consumes them. This means long chains have very little runtime overhead.
Performance
Iterators in Rust optimise to the same machine code as hand-written loops. There is no abstraction penalty — you get the higher-level expressiveness for free.