You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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方法可以直接在迭代器上实现滑动窗口效果:

  1. 先在Cargo.toml中添加依赖:
[dependencies]
itertools = "0.12"
  1. 代码实现:
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 06:15:03