map
:转换数据。接受一个闭包并为迭代器中的每个元素调用该闭包,然后返回一个新的迭代器,其中包含闭包返回的值。
let v = vec![1, 2, 3];
let v_squared: Vec<i32> = v.iter().map(|x| x * x).collect();
filter
:过滤数据。接受一个闭包并为迭代器中的每个元素调用该闭包。如果闭包返回true,则元素将包含在新的迭代器中。
use std::collections::HashMap;
fn main() {
let mut map: HashMap<&str, i32> = HashMap::new();
map.insert("红宝石", 1);
map.insert("蓝宝石", 2);
map.insert("河边捡的误以为是宝石的破石头", 18);
let evensvs: HashMap<&str, i32> =
map.into_iter().filter(|(a,b)| *b == 2 && *a =="红宝石").collect();
println!("{:?}", evensvs);
}
chain
:该方法是Iterator
trait的一个方法,它允许你将两个迭代器链接在一起,形成一个新的迭代器。这个新的迭代器会先遍历第一个迭代器中的所有素,然后再遍历第二个迭代器中的所有元素。
fn main() {
let v2 = vec![5, 10, 15];
let v1 = vec![5, 10, 15];
// copied():创建一个复制其所有元素的迭代器。
// collect():将迭代器转换为集合。collect()可以接受任何可迭代的东西,并将其转换为相关的集合
// 整体及为:将v1与v2 联结在一起,并创建一个复制的迭代器,并转换为集合。
let kv:Vec<i32> = v1.iter().chain(v2.iter()).copied().collect();
println!("{:?}", kv);
}
自定义结构体,使用迭代器
// 需要实现Iterator trait,并实现next方法
#[derive(Debug)]
struct People<'a> {
name : &'a str,
worki : i32,// 次数
}
impl Iterator for People<'static> {
type Item = i32;
fn next(&mut self) -> Option<Self::Item> {
self.worki = self.worki + 1;
if self.worki >= 10 {
None
}else {
Some(self.worki)
}
}
}
fn main() {
let mut pe = People{
name :"ceshi",
worki: 0,
};
let pp = &pe.next();
println!("1,{:#?}",pp);
let pp = &pe.next();
println!("2,{:#?}",pp);
let pp = &pe.next();
println!("3,{:#?}",pp);
println!("pe,{:#?}",pe);
}
输出:
1,Some(
1,
)
2,Some(
2,
)
3,Some(
3,
)
pe,People {
name: "ceshi",
worki: 3,
}