Метод reduce
Метод reduce сворачивает элементы итератора в одно значение, последовательно применяя функцию-аккумулятор к парам элементов. В отличие от метода fold, метод reduce не принимает начальное значение, а использует первый элемент итератора в качестве начального аккумулятора. Параметром метод принимает замыкание, которое получает текущий аккумулятор и следующий элемент, а возвращает новое значение аккумулятора.
Синтаксис
iter.reduce(func)
Пример
Давайте сложим все элементы вектора vec![1, 2, 3, 4, 5] с помощью метода reduce:
fn main()
{
let res = vec![1, 2, 3, 4, 5].into_iter().reduce(|acc, x| acc + x);
println!("{:?}", res);
}
Результат выполнения кода:
Some(15)
Пример
Давайте найдём максимальный элемент в векторе vec![1, 2, 3, 4, 5] с помощью метода reduce:
fn main()
{
let res = vec![1, 2, 3, 4, 5].into_iter().reduce(|acc, x| if x > acc { x } else { acc });
println!("{:?}", res);
}
Результат выполнения кода:
Some(5)
Пример
Давайте объединим все строки вектора vec!["a", "b", "c", "d", "e"] в одну строку с помощью метода reduce:
fn main()
{
let res = vec!["a", "b", "c", "d", "e"].into_iter().reduce(|acc, x| acc + x);
println!("{:?}", res);
}
Результат выполнения кода:
Some("abcde")
Пример
Если итератор пуст, метод reduce возвращает None:
fn main()
{
let res = Vec::<i32>::new().into_iter().reduce(|acc, x| acc + x);
println!("{:?}", res);
}
Результат выполнения кода:
None