Iterator adaptors build a pipeline. filter keeps matching items and map transforms them before collect.

Program

Play the program to keep even numbers and scale them.

map_filter.rs
Replay: real traced execution (multi-file project)
fn main() {
    let nums = vec![1, 2, 3, 4, 5];
    let doubled_evens: Vec<i32> = nums.iter().filter(|&&n| n % 2 == 0).map(|&n| n * 10).collect();
    println!("{doubled_evens:?}");
}
  1. nums ← [1, 2, 3, 4, 5], doubled_evens ← [20, 40]

    1fn main() {2    let num→ [1, 2, 3, 4, 5]s = vec![1, 2, 3, 4, 5];3    let doubled_even→ [20, 40]s: Vec<i32> = nums.iter().filter(|&&n| n % 2 == 0).map(|&n| n * 10).collect();4    println!("{doubled_evens:?}");5}
    output[20, 40]

Follow the Iterator

  1. nums starts as [1, 2, 3, 4, 5].
  2. filter keeps only the even values: 2 and 4.
  3. map multiplies each kept value by 10.
  4. collect gathers the transformed values into [20, 40].
  5. The program prints [20, 40]. | number | filter result | mapped value | | --- | --- | --- | | 1 | drop | - | | 2 | keep | 20 | | 3 | drop | - | | 4 | keep | 40 | | 5 | drop | - |
filter `filter` keeps items where the predicate is true.
map `map` transforms each remaining item.
collect `collect` gathers the results into a `Vec`.

Exercise: map_filter.rs

Reproduce the output [20, 40], then trace which numbers are dropped and which numbers become 20 and 40.