有没有办法将“ Vec <Vec <T >>”转换为“ Vec <T>”,将所有的“ Vec <T>”组合成一个“ Vec <T>”?

时间:2019-10-11 20:13:29

标签: rust

假设我有一个组织ID的载体

let orgs = vec![1, 3, 14, 12];

然后我在每个组织上调用.iter()以获取每个组织的事件,其中函数get_events_for()返回Vec<Event>

let events = orgs
    .iter()
    .map(|org_id| {
        get_events_for(org_id)
    })
    .collect();

当前,事件等于Vec<Vec<Event>>,那么如何将其转换为Vec<Event>

2 个答案:

答案 0 :(得分:3)

flat_map

let events = orgs
    .iter()
    .flat_map(get_events_for)
    .collect();

答案 1 :(得分:2)

使用此处已经给出的一些答案,这是一个更完整的实现形式:

#[derive(Debug)]
struct Event {
    id: usize
}

fn main() {
  let orgs = vec![1, 3, 14, 12];

  let events: Vec<Event> = orgs
    .iter()
    .flat_map(|org_id| {
        get_events_for(*org_id)
    })
    .collect();

  println!("{:?}", events);

}

fn get_events_for(id: usize) -> Vec<Event> {
   vec![Event {id}]
}

输出如下:

[Event { id: 1 }, Event { id: 3 }, Event { id: 14 }, Event { id: 12 }]

Playground