Метод flat_map
Метод flat_map класса Iterator применяет
функцию к каждому элементу исходного итератора.
В отличие от map, функция должна возвращать
не обычное значение, а итератор. Затем flat_map
объединяет все полученные итераторы в один
последовательный плоский итератор. Параметром метод
принимает замыкание, которое преобразует элемент
в итератор.
Метод возвращает новый итератор, который выдаёт элементы всех вложенных итераторов по порядку. Это удобно, когда каждый элемент нужно развернуть в несколько значений.
Синтаксис
iterator.flat_map(|x| /* iterator */)
Пример
Давайте развернём каждое число в диапазон от 0
до этого числа и соберём всё в один вектор:
fn main()
{
let res: Vec<i32> = vec![1, 2, 3, 4, 5]
.into_iter()
.flat_map(|x| 0..x)
.collect();
println!("{:?}", res);
}
Результат выполнения кода:
[0, 0, 1, 0, 1, 2, 0, 1, 2, 3]
Пример
Давайте разобьём каждую строку на символы и получим один плоский список символов:
fn main()
{
let res: Vec<char> = vec!["abcde", "12345"]
.into_iter()
.flat_map(|s| s.chars())
.collect();
println!("{:?}", res);
}
Результат выполнения кода:
['a', 'b', 'c', 'd', 'e', '1', '2', '3', '4', '5']
Пример
Давайте сравним поведение map и
flat_map на одном и том же наборе данных:
fn main()
{
let mapped: Vec<_> = vec![1, 2, 3]
.into_iter()
.map(|x| vec![x, x * 10])
.collect();
println!("{:?}", mapped);
let flat_mapped: Vec<_> = vec![1, 2, 3]
.into_iter()
.flat_map(|x| vec![x, x * 10])
.collect();
println!("{:?}", flat_mapped);
}
Результат выполнения кода:
[[1, 10], [2, 20], [3, 30]]
[1, 10, 2, 20, 3, 30]
Смотрите также
-
метод
map,
который преобразует каждый элемент итератора -
метод
flatten,
который разворачивает вложенные итераторы в один -
метод
filter_map,
который одновременно фильтрует и преобразует элементы -
метод
collect,
который собирает элементы итератора в коллекцию