Rust可迭代对象,提取第一条数据


方案一:使用 next() 方法(推荐)

match user_iter {
    Ok(iter) => {
        let first_user: Option<SysUserResponse> = iter.filter_map(Result::ok).next();
        match first_user {
            Some(user) => HttpResponse::Ok().json(user),
            None => HttpResponse::NotFound().body("User not found"),
        }
    },
    Err(_) => HttpResponse::InternalServerError().body("Database query error"),
}

方案二:使用索引访问(你当前代码中的方式)

match user_iter {
    Ok(iter) => {
        let users: Vec<SysUserResponse> = iter.filter_map(Result::ok).collect();
        if !users.is_empty() {
            HttpResponse::Ok().json(users[0])
        } else {
            HttpResponse::NotFound().body("User not found")
        }
    },
    Err(_) => HttpResponse::InternalServerError().body("Database query error"),
}

方案三:使用 get(0) 方法(更安全)

match user_iter {
    Ok(iter) => {
        let users: Vec<SysUserResponse> = iter.filter_map(Result::ok).collect();
        match users.get(0) {
            Some(user) => HttpResponse::Ok().json(user),
            None => HttpResponse::NotFound().body("User not found"),
        }
    },
    Err(_) => HttpResponse::InternalServerError().body("Database query error"),
}

推荐修改后的完整代码:

match user_iter {
    Ok(iter) => {
        match iter.filter_map(Result::ok).next() {
            Some(user) => HttpResponse::Ok().json(user),
            None => HttpResponse::NotFound().body("User not found"),
        }
    },
    Err(_) => HttpResponse::InternalServerError().body("Database query error"),
}

各方案对比:

方案优点缺点
next()最高效,只处理第一条数据需要处理 Option 类型
索引访问 [0]直观易懂需要先收集所有数据,可能越界
get(0)安全,不会越界需要先收集所有数据

推荐使用方案一,因为它最高效且安全,只处理需要的第一条数据,避免不必要的资源消耗。

声明:一代明君的小屋|版权所有,违者必究|如未注明,均为原创|本网站采用BY-NC-SA协议进行授权

转载:转载请注明原文链接 - Rust可迭代对象,提取第一条数据


欢迎来到我的小屋