Iterator pipelines can filter values, transform the survivors, and collect the final sequence.

Program

Play the program to choose the minimum value that passes through the pipeline.

min
filter_map_collect.rs
Replay: real traced execution (multi-file project)
fn main() {
    let min = 4;
    let values = [1, 3, 4, 6, 8];
    let doubled: Vec<i32> = values.iter().copied().filter(|value| *value >= min).map(|value| value * 2).collect();
    println!("{:?}", doubled);
}
fn main() {
    let min = 2;
    let values = [1, 3, 4, 6, 8];
    let doubled: Vec<i32> = values.iter().copied().filter(|value| *value >= min).map(|value| value * 2).collect();
    println!("{:?}", doubled);
}
fn main() {
    let min = 6;
    let values = [1, 3, 4, 6, 8];
    let doubled: Vec<i32> = values.iter().copied().filter(|value| *value >= min).map(|value| value * 2).collect();
    println!("{:?}", doubled);
}
  1. min ← 4, values ← [1, 3, 4, 6, 8], doubled ← [8, 12, 16]

    1fn main() {2    let mi→ 4n = 4; //@min=4, 2, 63    let value→ [1, 3, 4, 6, 8]s = [1, 3, 4, 6, 8];4    let double→ [8, 12, 16]d: Vec<i32> = values.iter().copied().filter(|value| *value >= min).map(|value| value * 2).collect();5    println!("{:?}", doubled);6}
    output[8, 12, 16]
  1. min ← 2, values ← [1, 3, 4, 6, 8], doubled ← [6, 8, 12, 16]

    1fn main() {2    let mi→ 2n = 2;3    let value→ [1, 3, 4, 6, 8]s = [1, 3, 4, 6, 8];4    let double→ [6, 8, 12, 16]d: Vec<i32> = values.iter().copied().filter(|value| *value >= min).map(|value| value * 2).collect();5    println!("{:?}", doubled);6}
    output[6, 8, 12, 16]
  1. min ← 6, values ← [1, 3, 4, 6, 8], doubled ← [12, 16]

    1fn main() {2    let mi→ 6n = 6;3    let value→ [1, 3, 4, 6, 8]s = [1, 3, 4, 6, 8];4    let double→ [12, 16]d: Vec<i32> = values.iter().copied().filter(|value| *value >= min).map(|value| value * 2).collect();5    println!("{:?}", doubled);6}
    output[12, 16]
filter `filter` keeps only values that satisfy the predicate.
map `map` transforms each surviving value into a new value.
collect `collect` materializes the lazy iterator pipeline into a `Vec<i32>`.