上一个简单的例子,你可能就容易明白
fn main() {
let data = vec![vec![1, 2], vec![3, 4], vec![5, 6, 7, 8]];
let new_data = data.iter().flat_map(|v| v); //Flat_map类型
println!("new_data :{:?}", new_data);
for v in new_data {
println!("v:{:?}", *v);
}
thread::sleep_ms(500000);
}
输出:
v:1
v:2
v:3
v:4
v:5
v:6
v:7
v:8
let words = ["alpha", "beta", "gamma"];
// chars() returns an iterator
let merged: String = words.iter()
.flat_map(|s| s.chars())
.collect();
assert_eq!(merged, "alphabetagamma");
(0..5).flat_map(|x| x * 100 .. x * 110)
.enumerate()
.filter(|&(i, x)| (i + x) % 3 == 0)
.for_each(|(i, x)| println!("{}:{}", i, x));
let a = ["1", "2", "lol"];
let mut iter = a.iter().filter_map(|s| s.parse().ok());
等价于:
let mut iter = a.iter()
.map(|s| s.parse()) //=>option
.filter(|s| s.is_ok())
.map(|s| s.unwrap());
什么情况你才能理解fitler_map的好?
比如:
use std::str::FromStr;
let text = "1\nfrond .25 289\n3.1415 estuary\n";
for number in text.split_whitespace()
.filter_map(|w| f64::from_str(w).ok()) {
println!("{:4.2}", number.sqrt());
}
输出:
1.00
0.50
17.00
1.77