理解 Rust 中的filter_map

Asn*_*ari 20 rust

我正在努力找出ages所有Person有第二个名字的人。我能够使用filtermap分别进行如下操作,但我想知道我们是否可以filter_map在 Rust 中使用。

但我无法弄清楚。

struct Person {
    pub first_name: String,
    pub last_name: Option<String>,
    pub age: i32,
}


fn main() {
    let mut persons: Vec<Person> = Vec::new();
    persons.push(Person {
        first_name: "Asnim".to_string(),
        last_name: None,
        age: 1,
    });
    persons.push(Person {
        first_name: "Fahim".to_string(),
        last_name: Some("Ansari".to_string()),
        age: 2,
    });
    persons.push(Person {
        first_name: "Shahul".to_string(),
        last_name: None,
        age: 6,
    });
    persons.push(Person {
        first_name: "Mujeeb".to_string(),
        last_name: Some("Rahuman".to_string()),
        age: 6,
    });

    let ages_of_people_with_second_name_using_seperate_filter_map: Vec<i32> = persons
        .iter()
        .filter(|p| p.last_name.is_some())
        .map(|p| p.age)
        .collect();

    println!("{:?}", ages_of_people_with_second_name)
}
Run Code Online (Sandbox Code Playgroud)

Mur*_*llo 34

是的。如果您阅读了文档,filter_map您就会意识到您有多接近。甚至可以使用Option的地图来帮助您

喜欢:

let ages_of_people_with_second_name_using_seperate_filter_map: Vec<i32> = persons
        .iter()
        .filter_map(|p| p.last_name.map(|_| p.age))
        .collect();
Run Code Online (Sandbox Code Playgroud)

或者更简单的方法,使用以下match模式:

let ages_of_people_with_second_name_using_seperate_filter_map: Vec<i32> = persons
        .iter()
        .filter_map(|p| match p.last_name { 
           Some(_) => Some(p.age),
           None => None
        })
        .collect();
Run Code Online (Sandbox Code Playgroud)


Mas*_*inn 17

但我想知道我们是否可以在 Rust 中使用 filter_map 。

但我无法弄清楚。

您可以,但它在这里并不是非常有用,因为您要过滤的元素和您要映射的元素不相关。

.filter_map(|p| p.last_name.as_ref().map(|_|, p.age))
Run Code Online (Sandbox Code Playgroud)

因此,您最好保留当前版本。

通常的目的filter_map是避免类似的冗余(以及可能的成本)

.filter(|p| p.last_name.is_some()).map(|p| p.last_name.unwrap())
Run Code Online (Sandbox Code Playgroud)

在这种情况下

.filter_map(|p| p.last_name)
Run Code Online (Sandbox Code Playgroud)

更短、更简单、更高效。