Rust中如何对列表做算子链式调用?求对应Kotlin代码的等价实现
问题核心原因
Rust 标准库中,windows() 是**切片(&[T])**专属的方法,仅能作用于存储在连续内存中的集合(比如数组、Vec)。你调用map后得到的是一个惰性迭代器,本身不存储元素,自然无法直接调用windows()方法。
标准库实现方案(无需引入第三方依赖)
只需要先把map生成的迭代器内容收集为Vec,就可以继续调用windows()完成后续操作,完整可运行代码如下:
fn main() { let window_size = 2; let input = [1, 2, 3, 4, 5, 6]; let result = input .windows(window_size) .map(|es| es.iter().sum::<i32>()) // 将求和后的迭代器收集为连续存储的Vec .collect::<Vec<i32>>() .windows(2) // 筛选第一个元素小于第二个的窗口 .filter(|win| win[0] < win[1]) .count(); println!("{}", result); // 输出结果为4 }
该方案和你给出的Kotlin代码逻辑完全对应,唯一的额外开销是需要分配一块内存存储求和后的中间结果。
零额外分配方案(使用第三方库)
如果不想为中间结果分配内存,可以使用Rust生态常用的迭代器扩展库itertools,它提供的tuple_windows方法可以直接在迭代器上实现滑动窗口效果:
- 先在
Cargo.toml中添加依赖:
[dependencies] itertools = "0.12"
- 代码实现:
use itertools::Itertools; fn main() { let window_size = 2; let input = [1, 2, 3, 4, 5, 6]; let result = input .windows(window_size) .map(|es| es.iter().sum::<i32>()) // 直接在迭代器上生成大小为2的滑动窗口,返回(前一个元素, 后一个元素)的元组 .tuple_windows() .filter(|(a, b)| a < b) .count(); println!("{}", result); // 输出结果为4 }
该方案不会额外分配存储中间结果的Vec,仅通过迭代器适配器缓存前一个元素实现滑动窗口逻辑,性能更高。
内容的提问来源于stack exchange,提问作者Mark Fisher
相关产品推荐
相关产品推荐

