选择拒绝

此页面描述了集合管道模式中的一个操作。有关更多上下文,请阅读

过滤

对每个元素运行一个布尔函数,并将通过该函数的元素放入输出。

您可以使用此函数仅保留要处理的输入项。例如

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}