选择满足clojure中给定谓词的集合的第一项

szy*_*ski 19 clojure

在clojure中是否有一个函数(给定谓词和集合),选择满足给定谓词的第一个项并停止迭代?

例如:

(select-first #(> % 10) (range))
=> 11
Run Code Online (Sandbox Code Playgroud)

如果没有,也许有人可能会暗示我有关惯用的实现

xsc*_*xsc 35

有多种可能性.

some

some 返回其谓词返回的第一个非零值.

(some #(when (> % 10) %) (range)) ;; => 11
Run Code Online (Sandbox Code Playgroud)

filter + first

filter保留那些与谓词匹配的元素,first检索它们中的第一个.

(first (filter #(> % 10) (range))) ;; => 11
Run Code Online (Sandbox Code Playgroud)

remove + first

如果你想找到与你的谓词匹配的第一个元素,那么remove你的朋友是:

(first (remove #(<= % 10) (range))) ;; => 11
Run Code Online (Sandbox Code Playgroud)

或者some:

(some #(when-not (<= % 10) %) (range)) ;; => 11
Run Code Online (Sandbox Code Playgroud)

所以,就是这样,我想.


edb*_*ond 8

首先使用过滤器

user=> (->> (range) (filter #(> % 10)) first)
11
user=> (first (filter #(> % 10) (range)))
11
Run Code Online (Sandbox Code Playgroud)