Rust: flat_map、filter_map、for_each

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值