以下代码
(let [coll [1 2 3 4 5]
filters [#(> % 1) #(< % 5)]]
(->> coll
(filter (first filters))
(filter (second filters))))
给我
(2 3 4)
哪个好,但是如何在coll中应用所有过滤器而不必明确命名它们?
可能有更好的方法可以做到这一点,但理想情况下我想知道上面可以替换(过滤器(第一个过滤器))(过滤器(第二个过滤器))的表达式。
谢谢!
答案 0 :(得分:18)
Clojure 1.3有一个新的every-pred
函数,你可以这样使用它:
(filter (apply every-pred filters) coll)
答案 1 :(得分:13)
这应该有效: -
(let [coll [1 2 3 4 5]
filters [#(> % 1) #(< % 5)]]
(filter (fn [x] (every? #(% x) filters)) coll)
)
答案 2 :(得分:1)
我不能说我对以下内容感到非常自豪,但至少它起作用并允许无限过滤器:
(seq
(reduce #(clojure.set/intersection
(set %1)
(set %2)) (map #(filter % coll) filters)))
如果您可以使用集合代替seqs,它将简化上述代码,如下所示:
(reduce clojure.set/intersection (map #(filter % coll) filters))
答案 3 :(得分:1)
(let [coll [1 2 3 4 5]
filters [#(> % 1) #(< % 5)]]
(reduce (fn [c f] (filter f c)) coll filters))