Iterators
Links:
- https://doc.rust-lang.org/book/ch13-02-iterators.html
- https://dev.to/martcpp/understanding-map-vs-flatmap-in-rust-with-a-simple-analogy-408g
Итераторы
Итераторы позволяют выполнять действия по очереди над цепочкой данных. Итератор берёт каждый объект цепочки и проверяет, не последний или он. Итераторы в Rust - ленивые, т.е не отрабатывают, пока не будет вызван метод, который их поглощает.
let v1 = vec![1, 2, 3];
let v1_iter = v1.iter();
for val in v1_iter { // iterator consume by for cycle
println!("Got: {val}");
}Отличие .map() и .flat_map()
Обе функции раскрывают итератор вектора, однако, с разным результатом:
fn main() {
let numbers = vec![1, 2, 3];
// Using `map()`
let mapped: Vec<Vec<i32>> = numbers.iter().map(|&n| vec![n, n * 10]).collect();
println!("{:?}", mapped); // [[1, 10], [2, 20], [3, 30]]
// Using `flat_map()`
let flat_mapped: Vec<i32> = numbers.iter().flat_map(|&n| vec![n, n * 10]).collect();
println!("{:?}", flat_mapped); // [1, 10, 2, 20, 3, 30]
}.map() - сохраняет структуру в итоговом результате .flat_map() - убирает лишние структуры