迭代器顾名思义就是帮我遍历集合内元素的工具,熟悉Java 编程都知道我们可以通过迭代器去遍历集合,通过hasNext 判断是否还有下一个,next 获取下一个元素。如下java代码
ArrayList numbers = new ArrayList();
while(it.hasNext()) {
Integer i = it.next();
if(i < 10) {
it.remove(); // 删除小于 10 的元素
}
}
迭代器的原理就是通过 next 不断地遍历集合里面的元素。我们看一下rust 里面迭代器trait的定义。
pub trait Iterator {
type Item;
fn next(&mut self) -> Option;
}
可以看到和上面的java 的定义是类似的,需要我们的对象去实现next 方法,从而在遍历的时候通过next 逐个获取集合元素。如果返回的Option里面有值则继续遍历,如果返回空则停止遍历。我们尝试实现一个next 迭代器。
struct Seq {
current : i32
}
impl Seq {
fn new() -> Self {
Seq { current: 0 }
}
}
impl Iterator for Seq {
type Item = i32;
fn next(&mut self) -> Option { //实现 next方法
if self.current < 100 {
self.current += 1;
return Some(self.current);
} else {
return None;
}
}
}
fn main() {
let mut seq = Seq::new();
while let Some(i) = seq.next() {
println!("{}", i);
}
}
你可能会说,什么鬼,如果我不去实现 Iterator 也可以直接调用next 去实现这个功能。对,迭代器的作用远不止如此。我们可以通过迭代器去遍历集合
fn main() {
let v = vec![1,2,3,4,5];
let mut iter = v.iter();
while let Some(i) = iter.next() {
println!("{}", i);
}
}
你又会说,我通过for 循环遍历就可以,还是没有啥特别的。那么我来一个函数级联例子
fn main() {
let v = vec![1,2,3,4,5,6,7,8,9];
let mut iter = v.iter() // 获取迭代器
.take(5) // 获取前5 个元素
.filter(|&x| x % 2 == 0) // 过滤偶数
.map(|&x| x * x) // 求平方
.enumerate(); // 转为带数组下标的迭代器
while let Some((i, v)) = iter.next() {
println!("{} {}", i, v);
}
}
上面的程序输出的结果为
0 4
1 16
分别是 2 和 4 的平方。我们可以通过迭代器对数据进行流式的处理,非常简洁。
我们再深度思考一下,其实 for 循环的本质也是依赖迭代器,后面在源码介绍的时候,我们再详细聊这个话题。总结一下,迭代器可以帮我们高效的完成集合元素的遍历和数据处理,我们只需要实现 next 方法就可以实现迭代器。
页面更新:2024-04-29
本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828
© CopyRight 2020-2024 All Rights Reserved. Powered By 71396.com 闽ICP备11008920号-4
闽公网安备35020302034903号