Rust: flat_map、filter_map、for_each

来源:互联网 发布:男士轻奢衣服品牌 知乎 编辑:程序博客网 时间:2024/06/07 21:56

上一个简单的例子,你可能就容易明白

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 iteratorlet 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