fn main() {
let string_vec: Vec<String> = vec![
"1.5".to_string(),
"2.0".to_string(),
"not_a_number".to_string(),
"3.5".to_string(),
];
let average = string_vec
.iter()
.filter_map(|s| s.parse::<f64>().ok())
.fold((0.0, 0), |(sum, count), num| (sum + num, count + 1))
.map(|(sum, count)| if count > 0 { sum / count as f64 } else { 0.0 });
println!("Average: {}", average);
}
迭代器适配器协同工作说明
.iter()
: 将Vec<String>
转换为迭代器,以便后续使用各种迭代器适配器方法。
.filter_map()
:
- filter: 过滤掉无效的转换结果。
- map: 将有效的字符串转换为
f64
类型。s.parse::<f64>().ok()
尝试将字符串s
解析为f64
,如果解析成功,ok()
返回Some(f64)
,否则返回None
。filter_map
会过滤掉None
,并将Some(f64)
中的f64
提取出来。
.fold()
:
- 初始化一个累加器
(0.0, 0)
,第一个元素用于累加浮点数的和,第二个元素用于统计有效浮点数的个数。
- 每次迭代,将当前的浮点数加到总和
sum
中,并将计数count
加1。
.map()
:
- 最后根据有效浮点数的个数计算平均值。如果有效浮点数个数
count
大于0,则返回总和sum
除以个数count
的结果;否则返回0.0。