Rust
Beginner
1 min read
Iterator Adapters and Closures
Example
use std::collections::HashMap;
fn main() {
let words = vec!["apple", "banana", "cherry", "apricot", "blueberry", "avocado"];
// Chain of adapters — no intermediate allocations
let a_words_upper: Vec<String> = words.iter()
.filter(|w| w.starts_with('a'))
.map(|w| w.to_uppercase())
.collect();
println!("a-words: {:?}", a_words_upper);
// fold — general reduction
let total_len: usize = words.iter().fold(0, |acc, w| acc + w.len());
println!("total char count: {total_len}");
// flat_map — flatten nested iterables
let letters: Vec<char> = words.iter()
.flat_map(|w| w.chars())
.filter(|c| *c == 'a')
.collect();
println!("count of 'a': {}", letters.len());
// enumerate + collect into HashMap
let index_map: HashMap<usize, &str> = words.iter()
.enumerate()
.map(|(i, &w)| (i, w))
.collect();
println!("word at index 2: {}", index_map[&2]);
// zip two iterators
let nums = vec![1u32, 2, 3];
let labels = vec!["one", "two", "three"];
let zipped: Vec<_> = nums.iter().zip(labels.iter()).collect();
println!("zipped: {:?}", zipped);
// scan — accumulating state mid-stream
let running: Vec<u32> = (1..=5)
.scan(0u32, |state, x| { *state += x; Some(*state) })
.collect();
println!("running sums: {:?}", running);
// any / all
println!("any > 5 chars: {}", words.iter().any(|w| w.len() > 5));
println!("all non-empty: {}", words.iter().all(|w| !w.is_empty()));
}