Skip to content
Rust

Iterator

Iterator adapters and consumers.

By EZ4Code Team
iteratoriterator

Code

fn main() {
    let nums = vec![1, 2, 3, 4, 5, 6, 7, 8, 9, 10];

    // map
    let squares: Vec<i32> = nums.iter().map(|x| x * x).collect();

    // filter
    let evens: Vec<&i32> = nums.iter().filter(|x| *x % 2 == 0).collect();

    // fold (reduce)
    let sum: i32 = nums.iter().fold(0, |acc, x| acc + x);

    // Chained calls
    let result: i32 = nums.iter()
        .filter(|x| *x % 2 == 0)
        .map(|x| x * x)
        .sum();

    // enumerate
    for (i, val) in nums.iter().enumerate() {
        println!("{}: {}", i, val);
    }

    // zip
    let names = vec!["Alice", "Bob"];
    let ages = vec![30, 25];
    let pairs: Vec<_> = names.iter().zip(ages.iter()).collect();

    // Custom iterator
    let mut counter = Counter::new();
    for c in counter.by_ref().take(3) {
        println!("count: {}", c);
    }
}

struct Counter { count: u32 }
impl Counter {
    fn new() -> Counter { Counter { count: 0 } }
}
impl Iterator for Counter {
    type Item = u32;
    fn next(&mut self) -> Option<Self::Item> {
        self.count += 1;
        if self.count <= 5 { Some(self.count) } else { None }
    }
}

Explanation

Iterators are lazy; adapter methods return new iterators; collect consumes the iterator to gather results.

More Rust Snippets