Module 5 • Lesson 28

Iterator Adapters and Chains

📚 9 min read💻 Free Course🦀 nixus.pro

Iterator Adapters

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

    // take and skip
    let first3: Vec<_> = data.iter().take(3).collect();
    let skip3: Vec<_>  = data.iter().skip(3).collect();
    println!("{:?}", first3); // [1, 2, 3]
    println!("{:?}", skip3);  // [4, 5, 6, 7, 8, 9, 10]

    // take_while / skip_while
    let tw: Vec<_> = data.iter().take_while(|&&x| x < 5).collect();
    let sw: Vec<_> = data.iter().skip_while(|&&x| x < 5).collect();

    // zip: combine two iterators into pairs
    let names = vec!["Alice", "Bob", "Charlie"];
    let scores = vec![95, 87, 78];
    let combined: Vec<_> = names.iter().zip(scores.iter()).collect();
    println!("{:?}", combined);

    // enumerate: add index
    for (i, name) in names.iter().enumerate() {
        println!("{}: {}", i, name);
    }

    // flat_map: map then flatten
    let sentences = vec!["hello world", "foo bar baz"];
    let words: Vec<&str> = sentences.iter().flat_map(|s| s.split(' ')).collect();
    println!("{:?}", words);

    // chain: concatenate iterators
    let a = vec![1, 2, 3];
    let b = vec![4, 5, 6];
    let chained: Vec<_> = a.iter().chain(b.iter()).collect();
    println!("{:?}", chained);

    // peekable
    let mut peekable = data.iter().peekable();
    if peekable.peek() == Some(&&1) { println!("starts with 1"); }
    println!("next: {:?}", peekable.next());
    println!("peek: {:?}", peekable.peek());
}

🎯 Practice

  1. Use zip to create a HashMap from two parallel Vecs (one of keys, one of values)
  2. Use flat_map to expand a Vec<Vec<i32>> into a single Vec<i32>
  3. Chain take_while and skip_while to extract the "middle" of a sequence

🎉 Key Takeaways