在Clojure Clojure.set/select与Clojure.core/Filter中筛选集合

在Clojure Clojure.set/select与Clojure.core/Filter中筛选集合,clojure,Clojure,我想筛选一组,例如: (filter-set even? #{1 2 3 4 5}) ; => #{2 4} 如果我使用clojure.core/filter我会得到一个非集合的seq: (filter even? #{1 2 3 4 5}) ; => (2 4) 所以我最好的选择是: (set (filter even? #{1 2 3 4 5})) 但我不喜欢它,从一组转到另一组看起来并不理想。Clojurian的方法是什么 更新 我做了以下比较@A.Webb和@Beyam

我想筛选一组,例如:

(filter-set even? #{1 2 3 4 5})
; => #{2 4}
如果我使用
clojure.core/filter
我会得到一个非集合的seq:

(filter even? #{1 2 3 4 5})
; => (2 4)
所以我最好的选择是:

(set (filter even? #{1 2 3 4 5}))
但我不喜欢它,从一组转到另一组看起来并不理想。Clojurian的方法是什么

更新

我做了以下比较@A.Webb和@Beyamor的方法。有趣的是,两者的性能几乎相同,但是
clojure.set/select
稍好一些

(defn set-bench []
  (let [big-set (set (take 1000000 (iterate (fn [x] (int (rand 1000000000))) 1)))]
    (time (set (filter even? big-set))) ; "Elapsed time: 422.989 msecs"
    (time (clojure.set/select even? big-set))) ; "Elapsed time: 345.287 msecs"
    nil) ; don't break my REPL !
是用于常见集合操作的方便API

在这种情况下,是一个特定于集合的过滤器。它的工作原理是将不满足谓词的元素从给定集合中分离出来

(require 'clojure.set)

(clojure.set/select even? #{1 2 3 4 5})
; => #{2 4} 

我不知道我怎么会在clojure.set文件中漏掉这个。谢谢值得注意的是,
clojure.set/select
的性能应该与
(set(filter…)
大致相同。试着为一个大的集合计时。请记住,(1)
filter
实际上并没有创建整个列表,因为它是懒惰的,(2)Clojure完全是关于不可变的数据结构的,所以您必须开始摆脱对创建新结构的自然厌恶。@A.Webb有趣的是,请参阅问题中的我的更新。