In functional programming, filter is a higher-order function that processes a data structure (usually a list) in some order to produce a new data structure containing exactly those elements of the original data structure for which a given predicate returns the Boolean value true
.
In Haskell, the code example
evaluates to the list 2, 4, …, 10 by applying the predicate even
to every element of the list of integers 1, 2, …, 10 in that order and creating a new list of those elements for which the predicate returns the Boolean value true, thereby giving a list containing only the even members of that list. Conversely, the code exampleeven
returns the Boolean value false (with .
being the function composition operator).
Below, you can see a view of each step of the filter process for a list of integers X = [0, 5, 8, 3, 2, 1]
according to the function :
This function express that if
x
True
False
Filter is a standard function for many programming languages, e.g.,Haskell,[1] OCaml,[2] Standard ML,[3] or Erlang.[4] Common Lisp provides the functions remove-if
and remove-if-not
.[5] Scheme Requests for Implementation (SRFI) 1 provides an implementation of filter for the language Scheme.[6] C++ provides the algorithms remove_if
(mutating) and remove_copy_if
(non-mutating); C++11 additionally provides copy_if
(non-mutating).[7] Smalltalk provides the select:
method for collections. Filter can also be realized using list comprehensions in languages that support them.
In Haskell, filter
can be implemented like this:
Here, <nowiki>[]</nowiki>
denotes the empty list, ++
the list concatenation operation, and [x | p x]
denotes a list conditionally holding a value, x
, if the condition p x
holds (evaluates to True
).
Filter | Notes | |
---|---|---|
APL | (''pred'' ''array'')/''array'' or ''pred''{{codett|{⍵/⍨⍺⍺ ⍵}|apl}}''array'' | The second example is an APL dop. |
C# 3.0 | ''ienum''.Where(''pred'') or The where clause | Where is an extension method ienum is an IEnumerable Similarly in all .NET languages |
CFML | obj.filter(func) | Where obj is an array or a structure. The func receives as an argument each element's value. |
Clojure | (filter ''predicate'' ''list'')<ref>[http://clojuredocs.org/clojure_core/1.3.0/clojure.core/filter clojure.core/filter on ClojureDocs]</ref> | Or, via list comprehension: (for [x ''list'' :when (''pred'' x)] x) |
Common Lisp | (remove-if ''inverted-pred'' ''list'')<br />(remove-if (complement ''pred'') ''list'')<br />(remove-if-not ''pred'' ''list'') | The function remove-if-not has been deprecated in favor of the equivalent remove-if where the predicate is complemented.[8] Thus the filter should be written or more simply: where evenp returns the inverted value of oddp .[9] |
C++ | std::remove_copy_if(''begin'', ''end'', ''result'', ''prednot'')<br />std::copy_if(''begin'', ''end'', ''result'', ''pred'') (C++11) | in header begin, end, result are iterators predicate is reversed |
D | std.algorithm.filter!(''pred'')(''list'') | |
Erlang | lists:filter(''Fun'', ''List'') | Or, via list comprehension: [ X <nowiki>||</nowiki> X <- List, Fun(X) ] |
Groovy | ''list''.findAll(''pred'') | |
Haskell | filter ''pred'' ''list'' | Or, via list comprehension: [x <nowiki>|</nowiki> x <- ''list'', ''pred'' x] |-| Haxe| ''list''.filter(''pred'') Lambda.filter(''list'', ''pred'')<br/> | Or, via list comprehension: [x <nowiki>|</nowiki> x <- ''list'', ''pred'' x] |-| J| (#~ ''pred'') ''list'' | An example of a monadic hook. # is copy, ~ reverses arguments. (f g) y = y f (g y) |-| Julia| filter(''pred'', ''array'') | The filter function also accepts ''dict'' datatype. Or, via list comprehension: [''x'' for ''x'' in ''array'' if ''pred(x)''] |-| Java 8+| ''stream''.filter(''pred'') ||-| JavaScript 1.6| ''array''.filter(''pred'') ||-| Kotlin| ''array''.filter(''pred'') ||-| Mathematica| Select[''list'', ''pred''] ||-| Objective-C (Cocoa in Mac OS X 10.4+)| [''array'' filteredArrayUsingPredicate:''pred''] | ''pred'' is an NSPredicate object, which may be limited in expressiveness|-| F#, OCaml, Standard ML| List.filter ''pred'' ''list'' ||-| PARI/GP| select(''expr'', ''list'') | The order of arguments is reversed in v. 2.4.2.|-| Perl| grep ''block'' ''list''<br /> grep ''expr'', ''list'' ||-| PHP| array_filter(''array'', ''pred'') ||-| Prolog| filter(+Closure,+List,-List) | Since ISO/IEC 13211-1:1995/Cor.2:2012[10] the core standard contains closure application via call/N [11] |-| Python| filter(''func'', ''list'') | Or, via list comprehension: [x for x in ''list'' if ''pred''(x)] . In Python 3, filter was changed to return an iterator rather than a list.[12] The complementary functionality, returning an iterator over elements for which the predicate is false, is also available in the standard library as filterfalse in the itertools module.|-| Ruby| ''enum''.find_all {''block''}<br /> ''enum''.select {''block''} | ''enum'' is an Enumeration|-| Rust| ''iterator''.filter(''pred'') | ''iterator'' is an [https://doc.rust-lang.org/std/iter/trait.Iterator.html Iterator] and the filter method returns a new iterator; ''pred'' is a function (specifically [https://doc.rust-lang.org/std/ops/trait.FnMut.html FnMut] ) that receives the iterator's item and returns a [https://doc.rust-lang.org/std/primitive.bool.html bool] |-| S, R| Filter(''pred'',''array'')<br />''array''[''pred''(''array'')] | In the second case, pred must be a vectorized function|-| Scala| ''list''.filter(''pred'') | Or, via for-comprehension: for(x <- ''list''; if ''pred'') yield x |-| Scheme R6RS| (filter ''pred'' ''list'') (remove ''inverted pred'' ''list'') (partition ''pred'' ''list'' ''list'') ||-| Smalltalk| ''aCollection'' select: ''aBlock'' ||-| Swift| ''array''.filter(''pred'')<br /> filter(''sequence'', ''pred'') ||-| XPath, XQuery| list[block] filter(list, func) | In block the context item . holds the current value|}VariantsFilter creates its result without modifying the original list. Many programming languages also provide variants that destructively modify the list argument instead for faster performance. Other variants of filter (e.g., Haskell See alsoReferences |
filter
filter
filter/2
filter
remove_if