Метод find_map
Метод find_map применяет заданную функцию
к каждому элементу итератора и возвращает первый
результат, который не является None.
Если ни один элемент не дал значения Some,
метод возвращает None. Параметром метод
принимает замыкание, которое получает элемент
итератора и возвращает значение типа Option.
Метод полезен, когда нужно одновременно преобразовать
элементы и найти первый подходящий, избегая двух
отдельных проходов через filter и map.
Синтаксис
iter.find_map(f)
Пример
Давайте найдём первое чётное число в векторе, преобразовав его в строку:
fn main()
{
let vec = vec![1, 3, 4, 5, 6];
let res = vec.iter().find_map(|x| {
if x % 2 == 0
{
Some(x.to_string())
}
else
{
None
}
});
println!("{:?}", res);
}
Результат выполнения кода:
Some("4")
Пример
Давайте попробуем найти элемент, для которого условие никогда не выполняется:
fn main()
{
let vec = vec![1, 3, 5, 7];
let res = vec.iter().find_map(|x| {
if x % 2 == 0
{
Some(x * 10)
}
else
{
None
}
});
println!("{:?}", res);
}
Результат выполнения кода:
None
Пример
Давайте найдём первую строку, которую можно преобразовать в число:
fn main()
{
let vec = vec!["a", "b", "123", "d"];
let res = vec.iter().find_map(|s| s.parse::<i32>().ok());
println!("{:?}", res);
}
Результат выполнения кода:
Some(123)
Смотрите также
-
метод
find,
который возвращает первый элемент, удовлетворяющий условию -
метод
filter_map,
который преобразует и фильтрует все элементы итератора -
метод
map,
который преобразует каждый элемент итератора -
метод
filter,
который оставляет только элементы, удовлетворяющие условию