过滤
对每个元素运行一个布尔函数,并将通过该函数的元素放入输出。
您可以使用此函数仅保留要处理的输入项。例如
ruby…
[1,2,3,4].select {|i| i.even?} # => [2, 4]
clojure…
(filter even? [1 2 3 4]) ;; => (2 4)
许多语言使用术语“选择”来表示此操作。“选择”一词的优势在于“拒绝”是一个自然的补充。
ruby…[1,2,3,4].select {|i| i.even?} # => [2, 4] [1,2,3,4].reject {|i| i.even?} # => [1, 3]
在语言使用“过滤”的情况下,有时会使用“删除”来表示“拒绝”。
使用“选择”作为名称的最大缺点是,一些库(如 dot net 的 Linq)使用“选择”作为 映射 的名称(基于 sql 中的用法,其中“选择”投影字段子集,这是 映射 的一种特殊形式)。
与许多操作一样,过滤哈希也存在一些问题。将单个参数解构为键和值对于支持它的语言(如 Clojure)来说效果很好。
clojure…(filter (fn [[k,v]] (> v 2)) {:BR 5, :IT 4, :ES 1} ) ;; => ([:IT 4] [:BR 5])
面向对象语言需要在哈希类上定义一个过滤操作 - ruby 使用 select 来实现这一点。
ruby…{BR: 5, IT: 4, ES: 1}.select{|k,v| v > 2} # => {:BR=>5, :IT=>4}