Clippy lints / Pedantic
Clippy lint · Pedantic · checked with Clippy 0.1.99
clippy::filter_map_next: called `filter_map(..).next()` on an `Iterator`
What it meansChecks for usage of _.filter_map(_).next(). It is in the pedantic group and off by default.
What you see
warning: called `filter_map(..).next()` on an `Iterator` --> main.rs:3:2 | 3 | (0..3).filter_map(|x| if x == 2 { Some(x) } else { None }).next(); | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | = help: for further information visit https://rust-lang.github.io/rust-clippy/stable/index.html#filter_map_next = note: `-W clippy::filter-map-next` implied by `-W clippy::pedantic` help: use `.find_map(..)` instead | 3 - (0..3).filter_map(|x| if x == 2 { Some(x) } else { None }).next(); 3 + (0..3).find_map(|x| if x == 2 { Some(x) } else { None }); |
Real output of Clippy 0.1.99 (Rust 1.99) on the example below. Names and line numbers in yours will differ.
Does it matter?
Readability, this can be written more concisely as _.find_map(_).
Stricter lints with some false positives. Off by default; opt in with clippy::pedantic.
How to fix it
Clippy can fix this one for you: run cargo clippy --fix (add --allow-dirty if you have uncommitted changes). Review the diff before you commit.
Flagged
(0..3).filter_map(|x| if x == 2 { Some(x) } else { None }).next();
Write this instead
(0..3).find_map(|x| if x == 2 { Some(x) } else { None });
Turn it off, or on
It is off by default. To use it, set it to warn or deny:
Whole crate (Cargo.toml)
[lints.clippy]
filter_map_next = "warn"In code
#![warn(clippy::filter_map_next)]One run
cargo clippy -- -W clippy::filter-map-nextThe [lints] table needs Rust 1.74 or newer. In a workspace, put it under [workspace.lints.clippy] and add [lints] workspace = true to each member.
Settings in clippy.toml
msrv: The minimum rust version that the project supports. Defaults to the rust-version field in Cargo.toml
Clippy's own documentation
What it does
Checks for usage of _.filter_map(_).next().
Why is this bad?
Readability, this can be written more concisely as
_.find_map(_).
Example
(0..3).filter_map(|x| if x == 2 { Some(x) } else { None }).next();
Can be written as
(0..3).find_map(|x| if x == 2 { Some(x) } else { None });
Configuration
-
msrv: The minimum rust version that the project supports. Defaults to therust-versionfield inCargo.toml(default:
current version)
From the Clippy lint list (0.1.99), part of the Rust project, MIT or Apache-2.0. Official entry.
Related lints
- too_many_linesChecks for functions with a large amount of lines
- missing_errors_docChecks the doc comments of publicly visible functions that return a Result type and warns if there is no # Errors section
- must_use_candidateChecks for public functions that have no #[must_use] attribute, but return something not already marked must-use, have no mutable arg and mutate no statics
- explicit_deref_methodsexplicit `deref` method call
- explicit_into_iter_loopChecks for loops on y.into_iter() where y will do, and suggests the latter
- explicit_iter_loopChecks for loops on x.iter() where &x will do, and suggests the latter
- flat_map_optionused `flat_map` where `filter_map` could be used instead
- float_cmpstrict comparison of `f32` or `f64`
- fn_params_excessive_boolsChecks for excessive use of bools in function declarations
All 847 Clippy lints · Rust compiler errors · Cargo.toml checker
Up next
Related lintclippy::too_many_linesChecks for functions with a large amount of linesRead it next →Did this answer your question?