MST
星途 面试题库

面试题:Rust集合操作中迭代器适配器的链式调用优化

给定一个`Vec<String>`,其中包含一些单词。需要对这个集合进行一系列操作:首先过滤掉长度小于3的单词,然后将剩下的单词全部转换为大写形式,最后计算这些大写单词的长度总和。请使用迭代器适配器链式调用实现该功能,并解释在链式调用过程中Rust是如何进行优化以避免不必要的中间数据结构生成的。
29.1万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试
fn main() {
    let words: Vec<String> = vec!["abc".to_string(), "de".to_string(), "fghi".to_string()];
    let total_length = words.iter()
                           .filter(|word| word.len() >= 3)
                           .map(|word| word.to_uppercase())
                           .map(|uppercase_word| uppercase_word.len())
                           .sum();
    println!("Total length: {}", total_length);
}

Rust的优化解释

  1. 延迟计算:在链式调用中,迭代器适配器(如filtermap)都是惰性的。它们并不会立即处理数据并生成中间数据结构。只有当调用sum这样的终端方法时,才会开始真正的迭代计算。
  2. 直接处理filter方法直接对源迭代器中的元素进行判断,只有符合条件的元素才会传递给下一个适配器。同样,map方法对传递过来的元素直接进行转换,不会产生额外的中间集合。
  3. 流水线式执行:整个链式调用就像一个流水线,元素从源迭代器开始,依次经过各个适配器的处理,最终到达终端方法。在这个过程中,不会生成多余的中间数据结构,从而提高了内存效率和性能。