如何过滤序列并保留评估的pred值?

Gan*_*ang 2 clojure

这是我多次遇到的情景,但没有找到适合它的惯用方法......

假设有人想使用自定义self-pred函数来过滤seq.此self-pred函数返回nil不需要的元素,以及有用元素的有用信息.期望保持self-pred这些所需元素的评估值.

我的一般解决方案是:

;; self-pred is a pred function which returns valuable info
;; in general, they are unique and can be used as key
(let [new-seq (filter self-pred aseq)]
   (zipmap (map self-pred new-seq) new-seq))
Run Code Online (Sandbox Code Playgroud)

基本上,它是self-pred在所有想要的元素上调用两次.我觉得它太丑了......

不知道有没有更好的方法.非常感谢任何输入!

Joo*_*aat 5

在这些场景中,您可以使用keep,但您必须更改"谓词"功能以返回所需的完整信息,或者nil每个项目.

例如:

(keep (fn [item] 
         (when-let [tested (some-test item)] 
           (assoc item :test-output tested))) aseq)
Run Code Online (Sandbox Code Playgroud)