迭代器

构造

use std::slice::Iter;
use std::iter::Iterator;
// 数组构造
let it = [1,2,3,4].iter();
// 向量构造
let it = vec![5; 3].iter();
// 可修改构造
let it = vec![5; 3].iter_mut();

合并

// chain()将两个迭代器顺序拼接合并,后续有例子,可拼接成无限多个
let it = (0..10).chain(20..30);
// 0~9~20~29

元组生成

zip() 将2个迭代器合并为一对一元组迭代器

let it = [1,3,5].iter().zip([2,4,6].iter());
assert_eq!(vec![(&1,&2),(&3,&4),(&5,&6)], it.collect::<Vec<(,)>>());
assert_eq!(vec![(0,'f'),(1,'o'),(2,'o')], (0..).zip("foo".chars()).collect::<Vec<_>>());
// 计算2个等长字符串中相同位置上字符不同的个数
let s1 = "amily";
let s2 = "emily";
let diff = s1.chars().zip(s2.chars()).filter(|x|x.0 != x.1).count();
println!("{diff}");//1

案例

遍历

while-next 模式

for-in 模式

for_each 模式

案例

遍历切片

遍历数组

下一个元素

next() 可多次调用,一次取出一个值,直至返回None。调用一次,迭代里中就会少一个元素。

提取前几个元素

take(k)取前面k个元素,只可调用一次 迭代器调用take()后,迭代器的所有权会被转移到take方法内部,因此一个迭代器的take方法只能调用一次。

使用后该迭代器不能再使用,所有权已经转移到 take 函数内部。

指定开始位

取得迭代器剩余元素中第k个位置的元素,位置从0开始;之后,迭代器跳转到下一个位置。

获取最后一个元素

只取最后一个元素,只能调用一次。所有权已经转移。

反转

跳过

skip(k)跳过k个元素

间隔步长

step_by(k),从第一个元素开始,每k个取一个出来

顺序合并

chain() 方法对迭代器进行顺序拼接合并

映射

map()方法,对迭代器中每一个元素进行映射

格式

案例

求值

案例

过滤

过滤数据。接受一个闭包并为迭代器中的每个元素调用该闭包。如果闭包返回true,则元素将包含在新的迭代器中。 对迭代器中的元素进行“过滤”,只留下满足条件的元素;

格式

案例

过滤与映射

案例

filter + map的组合。

收集

方法负责将迭代器中的元素按顺序收集到一个集合容器中。

全量校验

判断迭代器中是否所有元素都符合闭包predicate指定的测试。

格式

案例

累加器

fold()方法,通过传入一个初始值和一个闭包累加器,对迭代器中的每一个元素依次进行处理并“累加”,最后返回“累加”结果。这里用“累加”来指代函数操作,并不仅仅是能做加法。

格式

案例

Last updated