【Rust Iterator 之 fold,map,filter,for_each】

devtools/2024/11/27 23:41:28/

Rust Iterator 之 fold,map,filter,for_each

  • 前言
  • map
  • for_each
    • 通过源码看for_each
  • fold
  • filter
  • 总结


前言

在Iterator 一文中,我们提到过Iterator时惰性的,也就是当我们将容器转换成迭代器时不会产生任何的迭代行为,所以在使用时开发者还需要将迭代器与消费者适配器共同使用。


map

比较常见的例子是map方法,map在使用时如果开发者不使用消费者适配器,则run时不会发生任何的事情并且在编译期间会收到报错。
代码示例:

rust">fn usemapmethod() {let mut v = vec![1, 2, 3, 5];let vv = v.iter().map(|x| *x + 1);println!("{:?}", vv);
}
fn main() {usemapmethod();
}

上述代码使用了map想要使用闭包将每一个元素加1,但是没有使用消费者适配器,造成的结果就是打印的结果将与v中数据完全一致,因为map并没有执行,如果想要让其正确执行,需要配合消费者适配器,如下:

rust">fn usemapmethod() {let mut v = vec![1, 2, 3, 5];let vv: Vec<_> = v.iter().map(|x| *x + 1).collect();println!("{:?}", vv);
}
fn main() {usemapmethod();
}

for_each

for_each 如字面意思,遍历迭代器,处理数据,与map不同的是,它不需要消费者适配器,同时与map的返回值不同,它只返回(),上代码:

rust">use std::collections::HashMap;
fn usemapmethod() {let v = vec![1, 2, 3, 5];let mut mymap = HashMap::new();let _ = v.iter().for_each(|x| {mymap.insert(*x, *x + 1);});println!("{:?}", mymap);
}
fn main() {usemapmethod();
}

可以看到,在处理时我们直接将返回值丢弃,因为不同于消费者适配器返回的结果,我们通常不会接收for_each的返回结果,因为通常没有什么意义。

通过源码看for_each

rust">// We override the default implementation, which uses `try_fold`,// because this simple implementation generates less LLVM IR and is// faster to compile.#[inline]fn for_each<F>(mut self, mut f: F)whereSelf: Sized,F: FnMut(Self::Item),{while let Some(x) = self.next() {f(x);}}

可以看到,不同于map,在for_each 内部通过一个while循环直接进行了遍历。

fold

字面意思折叠,通过命名大概能猜测出fold的具体用途,既将通过 闭包处理的数据最后叠加到一起。

rust">use std::collections::HashMap;
fn usemapmethod() {let v = vec![1, 2, 3, 4, 6, 5];let result = v.iter().fold(0, |acc, num| if num % 3 == 0 { acc + num } else { acc });println!("{}", result)
}
fn main() {usemapmethod();
}

filter

按照特定的条件过滤符合的原有数据,当我们使用fold传入的acc值是0的时候,通常我们可以通过filter+sum的方式实现相同的逻辑,那么具体在实际使用过程中,应该如何挑选这里并没有什么约定俗成,选择自己适合并且容易理解的方式就选择filter+sum这通常满足我们的简单过滤和累计,fold试用于相对更复杂一点的逻辑。( 个人理解,当然你可以使用不同的组合方式创造出适合自己业务逻辑的代码)

rust">fn usemapmethod() {let v = vec![1, 2, 3, 4, 6, 5];let vv: i32 = v.iter().filter(|n| *n % 3 == 0).sum();println!("{}", vv)
}
fn main() {usemapmethod();
}

总结

在实际开发中会遇到各种各样的需求,熟练掌握method并理解其中的意义和作用,可以让我们更加rusty。

“积跬步,行万里。”


http://www.ppmy.cn/devtools/137514.html

相关文章

Spring Boot与林业产品推荐系统的融合

2 系统开发技术 这部分内容主要介绍本系统使用的技术&#xff0c;包括使用的工具&#xff0c;编程的语言等内容。 2.1 Java语言 Java语言自公元1995年至今&#xff0c;已经超过25年了&#xff0c;依然在软件开发上面有很大的市场占有率。当年Sun公司发明Java就是为了发展一门跨…

Code Review 指导方针

优质博文&#xff1a;IT-BLOG-CN Why Code Review? - 为什么要进行代码评审&#xff1f; Code Review是软件开发过程中的一个关键实践,它有以下几个重要目的: Improve Code Quality- 改进代码质量 【1】确保代码符合团队的编码标准、最佳实践和设计原则。 【2】识别并修正可…

Spring集成RabbitMQ

Spring集成RabbitMQ 官网&#xff1a;https://spring.io/projects/spring-amqp 创建聚合项目 父pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3…

BERT简单理解;双向编码器优势

目录 BERT简单理解 一、BERT模型简单理解 二、BERT模型使用举例 三、BERT模型的优势 双向编码器优势 BERT简单理解 (Bidirectional Encoder Representations from Transformers)模型是一种预训练的自然语言处理(NLP)模型,由Google于2018年推出。以下是对BERT模型的简…

Java爬虫:数据采集的强大工具

引言 在信息爆炸的今天&#xff0c;数据已成为企业决策的重要依据。无论是市场趋势分析、用户行为研究还是竞争对手监控&#xff0c;都离不开对海量数据的收集和分析。Java作为一种成熟且功能强大的编程语言&#xff0c;其在数据采集领域——尤其是爬虫技术的应用——展现出了…

JVM相关知识

Java中的JVM&#xff08;Java Virtual Machine&#xff0c;Java虚拟机&#xff09;是一个抽象的计算机&#xff0c;它提供了一个运行时环境来执行Java字节码。JVM的结构清晰且复杂&#xff0c;主要包括以下几个关键组件&#xff1a; 1. 类加载器&#xff08;Class Loader&…

Redis主从架构

Redis&#xff08;Remote Dictionary Server&#xff09;是一个开源的、高性能的键值对存储系统&#xff0c;广泛应用于缓存、消息队列、实时分析等场景。为了提高系统的可用性、可靠性和读写性能&#xff0c;Redis提供了主从复制&#xff08;Master-Slave Replication&#xf…

tomcat 文件上传 (CVE-2017-12615)

目录 1、漏洞描述 2、访问ip&#xff1a;port 3、漏洞利用 4、Exploit 5、修复建议 1、漏洞描述 Tomcat 是一个小型的轻量级应用服务器&#xff0c;在中小型系统和并发访问用户不是很多的场合下被普遍使用&#xff0c;是开发和调试JSP 程序的首选。 攻击者将有可能可通过…